精华内容
下载资源
问答
  • 三原色还原

    2019-10-23 07:38:00
    BGR 模式是一种可直接进行显示和压缩等处理的图像数据模式,它由 R( 红)、G( 绿) 、B( 蓝) 三原色值来共同确定 1 个像素点,例如富士数码相机采用的 SUPER CCD 图像传感器就采用这种模式,其优点是图像传感器产生的...

    1、Color Filter Array — CFA

    随着数码相机、手机的普及,CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式。BGR 模式是一种可直接进行显示和压缩等处理的图像数据模式,它由 R( 红)、G( 绿) 、B( 蓝) 三原色值来共同确定 1 个像素点,例如富士数码相机采用的 SUPER CCD 图像传感器就采用这种模式,其优点是图像传感器产生的图像数据无需插值就可直接进行显示等后续处理,图像效果最好,但是成本高,常用于专业相机中。一般数码相机的传感器(CCD 或 CMOS)约占整机总成本的 10%~25%,为了减少成本,缩小体积,市场上的数码相机大多采用 CFA 模式,即在像素阵列的表面覆盖一层彩色滤波阵列(Color Filter Array,CFA),彩色滤波阵列有多种,现在应用最广泛的是 Bayer 格式滤波阵列,满足 GRBG 规律,绿色像素数是红色或蓝色像素数的两倍,这是因为人眼对可见光光谱敏感度的峰值位于中波段,这正好对应着绿色光谱成分。

    上图就是一个采用 CFA 模式的图像传感器,有效分辨率为 640 x 480,该模式图像数据只用 R、G、B 3个值中的1 个值来表示 1 个像素点。这样一来每个像素点只能捕获三基色 R,G,B 中的一个,而缺失另外两个颜色值,这时候得到的是一幅马赛克图像。为了得到全彩色的图像, 需要利用其周围像素点的色彩信息来估计出缺失的另外两种颜色, 这种处理叫作色彩插值,也称作彩色插值或去马赛克。

    上图是一个8 x 8像素大小的 CFA 模式图像数据阵列,图中 1 个方格表示 1个像素,R、G、B 的数字下标表示其在 8 x 8 图像阵列中的位置。由于 CFA 模式所采用的图像颜色滤波阵列结构相对简单,并且所得到的图像数据仅仅是原始图像全部三原色信息的1 / 3 的数据,因此成本较低。但是,上图中的 CFA 模式图像数据与 BGR 模式的图像数据相比,缺少了 2 / 3 的图像颜色信息,所以要对 CFA 模式图像数据进行显示、压缩等后续处理,就需要事先对其进行插值运算,恢复CFA 模式图像数据所缺少的2 / 3 颜色信息,从而将 CFA 模式图像数据重建为与 BGR 模式图像相匹配的图像数据。比较常见的是双线性插值算法:该算法在对一个像素点的某颜色值进行插值运算时,会用该像素相邻像素点对应颜色值通过算数平均来估计。

    2、图像去噪

    在图像的采集和传输过程中,图像质量经常受到各种噪声的影响而下降。由于采集和各种元器件容易受到强干扰会产生脉冲噪声,由于照明不稳定,镜头灰尘以及非线性的信道传输引起的图像退化都会产生不同种类的噪声其主要影响人的视觉效果,使人难以辨认图像的某些细节,另外噪声给一些图像处理算法带来严重影响,例如梯度算子,由于一些与对象无关点的引入,使得无用信息的使用造成更加严重的后果,干扰了图像的可观测的信息。这里讨论的噪声仅仅局限在图像传感器获取图像数据时的噪声污染,由于这时候的数据量较少,噪声直接影响后面的插值算法,并使图像的细节无法体现,既影响图像的插值效果,也影响人的视觉感受。因此在图像处理中噪声的去除是一项非常重要的环节。

    3、自动聚焦

    自动聚焦目的是获得清晰度更高得图像。常用的聚焦方法分两类,一类是传统的聚焦方法,一种是基于数字图像处理方式的图像聚焦方法。传统的方式中,自动聚焦通过红外线或者超生波测距的方式来实现。这种方式需要安装发射机和接收机,增加了摄像机的成本,而且超声波对于玻璃后面的被摄物体不能很好的自动聚焦。这一类聚焦方式在某些场合受到了限制。因此在日趋集成化、微型化、低成本的应用中,基于数字图像处理的自动聚焦方法更具有优势。

    根据镜头成像分析,镜头的光学传递函数可以近似为高斯函数,它的作用等效为一个低通滤波器。离焦量越大,光学传递函数的截止频率越低。从频域上看,离焦量增大,对图像高频能量造成损失,使得图像的细节逐渐模糊。从空域上看,离焦量增大,点光源成像的光强分布函数越分散,可分辨的成像间距越大,图像相邻像素互相重叠,图像细节损失严重。因此图像清晰度评价函数时建立在图像边缘高频能量上的。

    数字处理方法中,自动聚焦的关键在于构造图像的清晰度评价函数。己经提出的图像清晰度评价函数苞括灰度方差、梯度能量、嫡函数和一些频域函数法。图像清晰度评价函数必须具有良好的单峰性和尖锐性,而且要计算量适度,从而可以快速的实现精准对焦。

    4、自动曝光

    曝光是用来计算从景物到达相机的光通量大小的物理量。图像传感器只有获得正确的曝光,才能得到高质量的照片。曝光过度,图像看起来太亮曝光不足,则图像看起来太暗。到达传感器的光通量的大小主要由两方面因素决定:曝光时间的长短以及光圈的大小。

    利用光圈进行自动曝光,主要根据所拍摄的场景来控制光圈大小,使得进光量维持在一定范围内。通过光圈进行曝光控制的成本比较高。现在市场所见的中低端摄像头采用的主流技术通过调整曝光时间来实现自动曝光。

    目前自动曝光控制算法方法有两种,一种是使用参照亮度值,将图像均匀分成许多的子图像,每一块子图像的亮度被用来设置参照亮度值,这个亮度值可以通过设置快门的速度来获得。另外一种方法是,通过研究不同光照条件下的亮度与曝光值之间的关系来进行曝光控制。这两种方法都是研究了大量的图像例子和许多不同的光照条件。而且均需要在不同的光照条件下所采集的图像数据库。实际中自动曝光研究需要解决好以下几个问题,首先是判定图像是否需要自动曝光,其次是自动曝光时,如何调整光电转换后数字信号来找出自动曝光能力补偿函数,最后就是调整到什么程度最为合适。

    5、伽马校正

    在视频采集显示系统中,光电转换(CCD/CMOS)和电光转换(CRT/LCD)的器件的转换特性都是非线性的。这些非线性期间都存在一个能反映各自特性的幂函数,用它来衡量非线性器件的转换特性。这种特性称为伽玛特性,在视频中由于伽玛特性的存在,会导致图像信号的亮度失真,降低通信质量,影响用户体验。因此要对这个失真进行补偿,即伽玛校正。
    光电转换器特性的非线性会引起图像非线性失真,图像的非线性失真主要表现在灰度的失真,即图像亮度层次的压缩与扩张,其图像表征为看起来被漂白或者太暗。摄像机/摄像头的伽玛特性大小一般为0.4 - 0.7,显示器的伽玛特性大小一般在1.3 - 2.5之间。
    伽玛校正的具体实现方法多种多样,较简单的实现方式是查表法。伽玛校正分两步。首先建立适合所用器件的伽玛校正表,然后根据输入的像素值查表获得伽玛校正后的数据。

    6、白平衡

    白平衡,字面上的理解是白色的平衡。用色彩学的知识解释,白色是指反射到人眼中的光线由于蓝、绿、红三种色光比例相同且具有一定的亮度所形成的视觉反应。白色光是由赤、橙、黄、绿、青、蓝、紫七种色光组成的,而这七种色光又是有红、绿、蓝三原色按不同比例混合形成,当一种光线中的三原色成分比例相同的时候,习惯上人们称之为消色,黑、白、灰、金和银所反射的光都是消色。通俗的理解白色是不含有色彩成份的亮度。人眼所见到的白色或其他颜色根物体本身的固有色、光源的色温、物体的反射或透射特性、人眼的视觉感应等诸多因素有关,举个简单的例子,当有色光照射到消色物体时,物体反射光颜色与入射光颜色相同,既红光照射下白色物体呈红色,两种以上有色光同时照射到消色物体上时,物体颜色呈加色法效应,如红光和绿光同时照射白色物体,该物体就呈黄色。当有色光照射到有色物体上时,物体的颜色呈减色法效应。如黄色物体在品红光照射下呈现红色,在青色光照射下呈现绿色,在蓝色光照射下呈现灰色或黑色。
    由于人眼具有独特的适应性,有时候不能发现色温的变化。比如在钨丝灯下呆久了,并不会觉得钨丝灯下的白纸偏红,如果突然把日光灯改为钨丝灯照明,就会觉查到白纸的颜色偏红了,但这种感觉也只能够持续一会儿。摄像头并不能像人眼那样具有适应性,所以如果摄像机的色彩调整同景物照明的色温不一致就会发生偏色。白平衡就是针对不同色温条件下,通过调摄像头内部的色彩电路使拍摄出来的影像抵消偏色,更接近人眼的视觉习惯。白平衡也可以简单地理解为在任意色温条件下,摄像头所拍摄的标准白色经过电路的调整,使之成像后仍然为白色。

    7、颜色空间

    颜色空间也称彩色模型(又称彩色空间或彩色系统),它的用途是在某些标准下用通常可接受的方式对彩色加以说明。本质上,彩色模型是坐标系统和子空间的阐述。位于系统的每种颜色都有单个点表示。 在彩色图像处理中,选择合适的彩色模型是很重要的。从应用的角度来看,人们提出的众多彩色模型可以分为两类。一类面向诸如彩色显示器或彩色打印机之类的硬设备(但可以与具体设备相关,也可以独立于具体设备),比如 RFB、CMY、YUV 模型。另一类面向视觉感知或者说以彩色处理分析为目的的应用,如动画中的彩色图形,各种图像处理的算法等,像 HSI、HSV 模型等。

    8、YUV 颜色空间

    亮度信号(Y)和色度信号(U,V)是相互独立的,也就是Y信号分量构成的黑白灰度图与用U,V信号构成的另外两幅单色图是相互独立的。由于Y,U,V是独立的,所以可以对这些单色图分别进行编码。黑白电视机能够接收彩色电视信号也就是利用了YUV分量之间的独立性。采用 YUV 颜色空间的好处在于人眼对彩色图象细节的分辨本领比对黑白图象低,因此,对色差信号, U、V,可以采用“大面积着色原理”。即用亮度信号Y 传送细节,用色差信号U、V 进行大面积涂色。因此,彩色信号的清晰度由亮度信号的带宽保证,而把色差信号的带宽变窄。正是由于这个原因,在多媒体计算机中,采用了 YUV 彩色空间,数字化的表示,通常采用Y:U:V = 8:4:4, 或者 Y:U:V = 8:2:2。例如8:2:2具体的做法是:对亮度信号Y,每个像素都用8位2进制数表示(可以有256级亮度),而U、V 色差信号每4个像素点用一个8位数表示,即画面的粒子变粗,但这样能够节约存储空间,将一个像素用24位表示压缩为用12位表示,节约 1/2 存储空间,而人的眼睛基本上感觉不出这种细节的损失,这实际上也是图像压缩技术的一种方法。

    YUV格式通常有两大类:打包(packed)格式和平面(planar)格式。前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。

    9、图像缩放

    图像缩放(Scaler)技术,也称图像尺度转换、图像重采样和图像分辨率转换技术,是视频图像处理中的关键技术,广泛应用于实现 FPD 图像分辨率转换。例如,高清晰度数字电视接收到 NTSC 或 PAL 格式的标准清晰度数字电视信号后需转换成 HDTV(1920×1080)格式,才能在 HDTV 的电视上显示;另外,等离子(PDP)电视、TFT-LCD 电视等逐行显示器,须提升接收到的图像分辨率使之和液晶显示屏的物理分辨率一致,才能在终端上显示出视频图像;因此,Scaler 性能的优劣,将直接决定显示器图像的质量。

    图像缩放可理解为图像的重采样过程,关键在于用连续模型函数来拟合原始离散图像,在求得连续模型参数后,根据所需缩放倍率对此连续图像进行重采样,得到符合目标分辨率的离散图像。数字图像重采样的本质是对离散图像点进行插值的过程。根据采样/重建理论,理想的插值核为 sinc 函数,但在物理上是不可实现的。通常的插值核函数都是采用近似于 sinc 函数的有限宽度插值函数。最近邻域法是最简单的缩放算法,但会使处理后的图像产生明显的锯齿形边缘和马赛克效应。双线性插值法虽然能解决最近邻域法所存在的问题,但却容易造成图像边缘的模糊。作为改进,又提出了加窗 sinc 核函数,从而得到了高次插值算法,如立方插值、高次样条插值等。
    ————————————————
     

    展开全文
  • CTF—RGB三原色

    2021-07-27 17:22:46
    其实不难发现这应该是RGB三原色,我们就找个白色画布,把文件读进来。 (1)文档一共61366所以我们用在线工具进行质因数分解 因为我们要的图片是二维的,所以只需要两个质数【503*122】 (2)打开电脑的画图功能...

    将题目附件现在下来打开,发现很多的三个一组的数字排列,排列之后可以看到一共有61366组。
    在这里插入图片描述

    其实不难发现这应该是RGB三原色,我们就找个白色画布,把文件读进来。

    (1)文档一共61366所以我们用在线工具进行质因数分解
    

    在这里插入图片描述
    因为我们要的图片是二维的,所以只需要两个质数【503*122】

    (2)打开电脑的画图功能生成一张空白的,大小为【503*122】的图片并保存在桌面
    (3)用java脚本将 【数字文档】的 数据 写入 【图片】
    

    相关代码:

    public class test {
    
          public static void main(String[] args) throws IOException {
    
            BufferedReader br = new BufferedReader(new InputStreamReader(
    
                new FileInputStream("D:\misc100.txt")));
    
          int i,j;
    
         
    
          String line = br.readLine();
    
          int rgb[] = new int[3];
    
          File file = new File("D:\2.jpg");
    
          BufferedImage bi = null;
    
          bi = ImageIO.read(file);
    
          int width = bi.getWidth();
    
          int height = bi.getHeight();
    
          int minx = bi.getMinX();
    
          int miny = bi.getMinY();
    
          for (i = 0;i < width; i++){
    
             for (j = 0; j < height; j++){
    
                if(line == null) break;
    
                String[] rgbs=line.toString().split(",");
    
                rgb[0]=new Integer(rgbs[0]);
    
                rgb[1]=new Integer(rgbs[1]);
    
                rgb[2]=new Integer(rgbs[2]);
    
                bi.setRGB(i,j,Integer.parseInt(Integer.toHexString(rgb[0])+Integer.toHexString(rgb[1])+Integer.toHexString(rgb[2]),16));
    
                //bi.setRGB(i,j,Integer.parseInt("ffffff",16))
    
                 line = br.readLine();
    
                   } 
    
                }
    
               ImageIO.write(bi, "JPEG", file);
    
                br.close();
    
             }
    
          }
    ```java
    在这里插入代码片
    
    注意代码中的文件位置需要根据实际情况进行更改
    

    运行代码之后可以在你设定的路径下得到一张图片。
    打开就可以看到 flag
    在这里插入图片描述

    如果图片看不清的话就调整一下像素,256*245,再运行一下
    

    在这里插入图片描述

    展开全文
  • 计算图片基础三原色

    2013-05-30 10:52:21
    //获取每一像素上的三原色叠加 ColorModel cm = ColorModel.getRGBdefault(); int red = 0, green = 0, blue = 0; for (int i = 0; i ; i++) { red += cm.getRed(pixels[i]); green += cm....
    public void getBaseColor(){
    		//获取Image图像
    		String fileName = "D:/LYM/temp/color.jpg";
    		Image image = null;
    		try {
    			image = ImageIO.read(new FileInputStream(fileName));
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		if(image != null){
    			int iw = image.getWidth(null);
    			int ih = image.getHeight(null);
    			int size = iw * ih;
    			int[] pixels = new int[size];
    			
    			//创建一个 PixelGrabber 对象,以从指定图像将像素抓取到给定的数组pixels中
    			PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);
    			try {
    				pg.grabPixels();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			
    			//获取每一像素上的三原色叠加
    			ColorModel cm = ColorModel.getRGBdefault();
    			int red = 0, green = 0, blue = 0;
    			for (int i = 0; i < size; i++) {
    				red += cm.getRed(pixels[i]);
    				green += cm.getGreen(pixels[i]);
    				blue += cm.getBlue(pixels[i]);
    			}
    			
    			//计算平均三原色
    			red = red / size;
    			green = green / size;
    			blue = blue / size;
    			System.out.println("rgb(" + red + "," + green + "," + blue + ")");
    		}
    	}

    输出  rgb(68,73,78)

    展开全文
  • 分别是:利用色光三原色来调整图片颜色,利用颜色矩阵来调整图片颜色,利用调整每一个像素点来调整图片颜色。显然调整颜色的方式是越来越细致的。那么在这一篇文章中,就总结一下通过色光三原色来调整图片的颜色。 ...

          最近学习了android中的图片颜色的处理,现在来总结一下。android中存在三种方式来调整图片的颜色,来达到不同的效果。分别是:利用色光三原色来调整图片颜色,利用颜色矩阵来调整图片颜色,利用调整每一个像素点来调整图片颜色。显然调整颜色的方式是越来越细致的。那么在这一篇文章中,就总结一下通过色光三原色来调整图片的颜色。

     

    一、基础知识

         首先说一下基础的颜色知识。android中采取的颜色模型是RGBA模型。即R代表红色,G代表绿色,B代表蓝色,A代表透明度。而通过改变一张图片的三原色的色相,饱和度,亮度就可以改变一张图片的颜色。

         所谓色相,就是指具体的颜色,比如说红色,黄色等就是一种具体的颜色。而饱和度就是指颜色的纯度,值从0%到100%。亮度就是指颜色相对的明暗程度。只要改变这三个值,就可以实现不同的颜色效果。

           android中是通过ColorMatrix类来改变色光三原色的,从这个类就可以看出其实本质还是通过改变颜色矩阵来改变颜色的,只不过封装的好。所以颜色矩阵实现不同的颜色是基本的原理,在下一篇的文章中会讲到。下面就看一看要用到的方法,代码如下:

     1 //实例化处理色相的颜色矩阵
     2 ColorMatrix hugeMatrix = new ColorMatrix();
     3 hugeMatrix.setRotate(0, huge);//0表示红色
     4 hugeMatrix.setRotate(1, huge);//1表示设置绿色
     5 hugeMatrix.setRotate(2, huge);//2表示蓝色
     6         
     7 //实例化处理饱和度的矩阵
     8 ColorMatrix satMatrix = new ColorMatrix();
     9 //查看该方法的源码发现,只设置一个值方法内部就直接改变了每一个三原色的饱和度
    10 satMatrix.setSaturation(saturation);
    11         
    12 //实例化处理亮度的矩阵
    13 ColorMatrix lumMatrix = new ColorMatrix();
    14 //参数从左到右依次为红色亮度,绿色,蓝色,透明度(1表示完全不透明)
    15 lumMatrix.setScale(lum, lum, lum, 1);

          上面的代码注释很明白了,需要说明的事huge,saturation,lum都是float类型的值,为0-255之间。有了这些基础知识,我们就可以改变一张图片的颜色了。

           或许你还是很糊涂,虽然通过上面的代码,你知道怎么设置色光三原色的色相,饱和度和亮度,但是你还不知道怎么将设置好的颜色替换掉已有图片的颜色。那么就接着看下面的代码,下面的代码是一个实现图片颜色变化的工具类,该工具类中的静态方法实现了将一张图片变换颜色效果。具体思路就是传入一张图片,由于android不允许在已有的bitmap上操作,所以我们要新建一个bitmap,然后用设置好的颜色来设置画笔,接着用画笔画出一张和原来图片一样大小的bitmap,只是颜色变成了我们设置的颜色了而已,然后将该图片返回。好了,我们来看这个工具类的具体代码,注释很详细,你应该能看得懂。如下:

     1 /*
     2  * 用来处理图片颜色的工具类
     3  */
     4 public class ImageHelper {
     5     
     6     /**
     7      * 该方法根据色光三原色,改变图片颜色
     8      * @param bmp 原图片
     9      * @param huge 色相
    10      * @param saturation 饱和度
    11      * @param lum 亮度
    12      * @return
    13      */
    14     public static Bitmap ImageUtil(Bitmap bmp,float huge,float saturation,float lum){
    15         //注意,android不允许在原有的bitmap上操作,因此我们必须重画一个btimap来保存我们所做的操作并返回
    16         //第三个参数为制定颜色模式,通常会使用bitmap的最高处理方式
    17         Bitmap btp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.ARGB_8888);
    18         
    19         Canvas canvas = new Canvas(btp);//实例化一块画布
    20         Paint mPaint = new Paint();//实例化一支画笔
    21         mPaint.setStrokeWidth(Paint.ANTI_ALIAS_FLAG);//设置为抗锯齿
    22         
    23         //实例化处理色相的颜色矩阵
    24         ColorMatrix hugeMatrix = new ColorMatrix();
    25         hugeMatrix.setRotate(0, huge);//0表示红色
    26         hugeMatrix.setRotate(1, huge);//1表示设置绿色
    27         hugeMatrix.setRotate(2, huge);//2表示蓝色
    28         
    29         //实例化处理饱和度的矩阵
    30         ColorMatrix satMatrix = new ColorMatrix();
    31         //查看该方法的源码发现,只设置一个值方法内部就直接改变了每一个三原色的饱和度
    32         satMatrix.setSaturation(saturation);
    33         
    34         //实例化处理亮度的矩阵
    35         ColorMatrix lumMatrix = new ColorMatrix();
    36         //参数从左到右依次为红色亮度,绿色,蓝色,透明度(1表示完全不透明)
    37         lumMatrix.setScale(lum, lum, lum, 1);
    38         
    39         //再实例化一个颜色矩阵将上面的颜色设定都柔和再一起
    40         ColorMatrix imageMatrix = new ColorMatrix();
    41         imageMatrix.postConcat(hugeMatrix);
    42         imageMatrix.postConcat(satMatrix);
    43         imageMatrix.postConcat(lumMatrix);
    44         
    45         //将调好的颜色设置给画笔
    46         mPaint.setColorFilter(new ColorMatrixColorFilter(imageMatrix));
    47         //然后我们用调整好的颜色画笔将原来的图片bmp画到新的bitmap上
    48         canvas.drawBitmap(bmp, 0, 0, mPaint);
    49         
    50         return btp;
    51         
    52     }
    53 }

          有了这个工具类,我们就可以真的为一张图片来变化其颜色了。下面我们来实战一下吧。

     

    二、实战演示图片颜色变化

          我们废话少说,直接来写代码。新建项目”图像处理“,首先编写它的activity_main.xml。代码很简单,无非就是给按钮注册一个点击事件。我就不解释了,如下:

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:gravity="center">
     6 
     7     <TextView
     8         android:id="@+id/txt_img"
     9         android:layout_width="match_parent"
    10         android:layout_height="wrap_content"
    11         android:text="图像实验" 
    12         android:textSize="30sp"
    13         android:gravity="center"
    14         android:background="#cc00ff"/>
    15     <Button 
    16         android:id="@+id/bnt_imgcolor1"
    17          android:layout_width="match_parent"
    18         android:layout_height="wrap_content"
    19         android:text="调整三原色" 
    20         android:textSize="30sp"
    21         android:gravity="center"
    22         android:layout_below="@id/txt_img"
    23         android:onClick="preferenceClick"
    24         />
    25       <Button 
    26         android:id="@+id/bnt_imgcolor2"
    27          android:layout_width="match_parent"
    28         android:layout_height="wrap_content"
    29         android:text="调整颜色矩阵" 
    30         android:textSize="30sp"
    31         android:gravity="center"
    32         android:layout_below="@id/bnt_imgcolor1"
    33         android:onClick="matrixClick"
    34         />
    35        <Button 
    36         android:id="@+id/bnt_imgcolor3"
    37          android:layout_width="match_parent"
    38         android:layout_height="wrap_content"
    39         android:text="调整色素" 
    40         android:textSize="30sp"
    41         android:gravity="center"
    42         android:layout_below="@id/bnt_imgcolor2"
    43         android:onClick="pxClick"
    44         />
    45 
    46 </RelativeLayout>

          你会发现有三个按钮,在这里,我们只实现第一个按钮”调整三原色“。其他两个按钮的实现,也就是颜色矩阵和像素点改变图片效果我们放在后面的两篇文章中讲解。

          然后我们再新建一个color1.xml,是用来显示图片用的,在这里需要一张图片,读者可以自行设定为自己的图片即可。代码如下:

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     >
     6     <ImageView
     7         android:id="@+id/img"
     8         android:layout_width="wrap_content"
     9         android:layout_height="wrap_content"
    10         android:src="@drawable/test1">
    11         </ImageView>
    12     <SeekBar 
    13         android:id="@+id/sbr_huge"
    14         android:layout_width="match_parent"
    15         android:layout_height="wrap_content"
    16         android:layout_below="@id/img"/>
    17      <SeekBar 
    18         android:id="@+id/sbr_sat"
    19         android:layout_width="match_parent"
    20         android:layout_height="wrap_content"
    21         android:layout_marginTop="30dp"
    22         android:layout_below="@id/sbr_huge"/>
    23      <SeekBar 
    24         android:id="@+id/sbr_lum"
    25         android:layout_width="match_parent"
    26         android:layout_height="wrap_content"
    27         android:layout_marginTop="30dp"
    28         android:layout_below="@id/sbr_sat"/>
    29    
    30 
    31 </RelativeLayout>

          好了,然后我们再新建一个活动”ColorAdjustActivity“,用来将这个布局显示出来,注意不要忘记注册这个活动哦!代码如下:

      1 package com.fuly.image;
      2 
      3 import android.app.Activity;
      4 import android.graphics.Bitmap;
      5 import android.graphics.BitmapFactory;
      6 import android.os.Bundle;
      7 import android.widget.ImageView;
      8 import android.widget.SeekBar;
      9 
     10 public class ColorAdjustActivity extends Activity implements SeekBar.OnSeekBarChangeListener{
     11     
     12     private ImageView img;
     13     private SeekBar sbrHuge;
     14     private SeekBar sbrSat;
     15     private SeekBar sbrLum;
     16     
     17     private static final int MAX_VALUE = 255;
     18     private static final int MIDDLE_VALUE = 127;
     19     
     20     private float huge;//色相
     21     private float sat;//饱和度
     22     private float lum;//亮度
     23     
     24     private Bitmap priBmp;//原始图片
     25     
     26 
     27     protected void onCreate(Bundle savedInstanceState) {
     28         super.onCreate(savedInstanceState);
     29         setContentView(R.layout.color1);
     30         
     31         img = (ImageView) findViewById(R.id.img);
     32         sbrHuge = (SeekBar) findViewById(R.id.sbr_huge);
     33         sbrSat = (SeekBar) findViewById(R.id.sbr_sat);
     34         sbrLum = (SeekBar) findViewById(R.id.sbr_lum);
     35         
     36         priBmp = BitmapFactory.decodeResource(getResources(), R.drawable.test1);
     37         
     38         //注册监听器
     39         sbrHuge.setOnSeekBarChangeListener(this);
     40         sbrSat.setOnSeekBarChangeListener(this);
     41         sbrLum.setOnSeekBarChangeListener(this);
     42         
     43         sbrHuge.setMax(MAX_VALUE);//设定最大范围
     44         sbrSat.setMax(MAX_VALUE);
     45         sbrLum.setMax(MAX_VALUE);
     46         
     47         sbrHuge.setProgress(MIDDLE_VALUE);//设定初始停留位置
     48         sbrSat.setProgress(MIDDLE_VALUE);//设定初始停留位置
     49         sbrLum.setProgress(MIDDLE_VALUE);//设定初始停留位置
     50     }
     51 
     52 
     53 
     54     /**
     55      * 在该方法中我们监听每一个seekBar的状态改变
     56      * @param seekBar 我们点击的seekBar控件
     57      * @param progress  当前点击位置的值
     58      * @param fromUser
     59      */
     60     public void onProgressChanged(SeekBar seekBar, int progress,
     61             boolean fromUser) {
     62         
     63         switch(seekBar.getId()){
     64         
     65         case R.id.sbr_huge:
     66             //获得色相的计算公式
     67               huge = (progress - MIDDLE_VALUE) * 1.0F / MIDDLE_VALUE * 180;
     68             break;
     69         case R.id.sbr_sat:
     70             //获得饱和度的计算公式
     71             sat = progress*1.0f/MIDDLE_VALUE;
     72             break;
     73         case R.id.sbr_lum:
     74             //获得亮度的计算公式
     75             lum = progress*1.0f/MIDDLE_VALUE;
     76             break;
     77         }
     78         Bitmap bt = ImageHelper.ImageUtil(priBmp, huge, sat, lum);
     79         
     80         img.setImageBitmap(bt);//注意这一步,就实现了图片效果的改变
     81     }
     82 
     83 
     84 
     85     /**
     86      * 该方法在用户刚刚点击seeBar时被调用,一般在这里可以禁止用户对
     87      * seeBar的操作
     88      */
     89     public void onStartTrackingTouch(SeekBar seekBar) {
     90 
     91         
     92     }
     93 
     94 
     95 
     96     /**
     97      * 该方法在用户完成seeBar的操作时会被调用,一般来说,如果用户禁用了seekBar,
     98      * 则可能会在这个方法里重新启用seekBar
     99      * 
    100      */
    101     public void onStopTrackingTouch(SeekBar seekBar) {
    102     
    103         
    104     }
    105 
    106 }

          上面的代码注释很清晰了,我就不多解释了。发现了没有,在78行,我们调用了处理图片颜色的工具类。所以我们要把这个工具类编写出来,其实就是上面基础知识的那个工具类。新建类”ImageHelper“,代码如下:

     1 package com.fuly.image;
     2 
     3 import android.graphics.Bitmap;
     4 import android.graphics.Canvas;
     5 import android.graphics.Color;
     6 import android.graphics.ColorMatrix;
     7 import android.graphics.ColorMatrixColorFilter;
     8 import android.graphics.Paint;
     9 
    10 /*
    11  * 用来处理图片颜色的工具类
    12  */
    13 public class ImageHelper {
    14     
    15     /**
    16      * 该方法根据色光三原色,改变图片颜色
    17      * @param bmp 原图片
    18      * @param huge 色相
    19      * @param saturation 饱和度
    20      * @param lum 亮度
    21      * @return
    22      */
    23     public static Bitmap ImageUtil(Bitmap bmp,float huge,float saturation,float lum){
    24         //注意,android不允许在原有的bitmap上操作,因此我们必须重画一个btimap来保存我们所做的操作并返回
    25         //第三个参数为制定颜色模式,通常会使用bitmap的最高处理方式
    26         Bitmap btp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.ARGB_8888);
    27         
    28         Canvas canvas = new Canvas(btp);//实例化一块画布
    29         Paint mPaint = new Paint();//实例化一支画笔
    30         mPaint.setStrokeWidth(Paint.ANTI_ALIAS_FLAG);//设置为抗锯齿
    31         
    32         //实例化处理色相的颜色矩阵
    33         ColorMatrix hugeMatrix = new ColorMatrix();
    34         hugeMatrix.setRotate(0, huge);//0表示红色
    35         hugeMatrix.setRotate(1, huge);//1表示设置绿色
    36         hugeMatrix.setRotate(2, huge);//2表示蓝色
    37         
    38         //实例化处理饱和度的矩阵
    39         ColorMatrix satMatrix = new ColorMatrix();
    40         //查看该方法的源码发现,只设置一个值方法内部就直接改变了每一个三原色的饱和度
    41         satMatrix.setSaturation(saturation);
    42         
    43         //实例化处理亮度的矩阵
    44         ColorMatrix lumMatrix = new ColorMatrix();
    45         //参数从左到右依次为红色亮度,绿色,蓝色,透明度(1表示完全不透明)
    46         lumMatrix.setScale(lum, lum, lum, 1);
    47         
    48         //再实例化一个颜色矩阵将上面的颜色设定都柔和再一起
    49         ColorMatrix imageMatrix = new ColorMatrix();
    50         imageMatrix.postConcat(hugeMatrix);
    51         imageMatrix.postConcat(satMatrix);
    52         imageMatrix.postConcat(lumMatrix);
    53         
    54         //将调好的颜色设置给画笔
    55         mPaint.setColorFilter(new ColorMatrixColorFilter(imageMatrix));
    56         //然后我们用调整好的颜色画笔将原来的图片bmp画到新的bitmap上
    57         canvas.drawBitmap(bmp, 0, 0, mPaint);
    58         
    59         return btp;
    60         
    61     }
    62 }

          代码就不用我多解释了吧。最后别忘记在MainActivity中实现活动的跳转,即点击”调整三原色“按钮,跳到图片显示界面。代码如下:

     1 package com.fuly.image;
     2 
     3 import android.os.Bundle;
     4 import android.view.View;
     5 import android.app.Activity;
     6 import android.content.Intent;
     7 
     8 public class MainActivity extends Activity {
     9     
    10 
    11   
    12     protected void onCreate(Bundle savedInstanceState) {
    13         super.onCreate(savedInstanceState);
    14         setContentView(R.layout.activity_main);
    15     }
    16 
    17     /*
    18      * btn1的点击事件
    19      */
    20       public void preferenceClick(View view){
    21           
    22           Intent intent = new Intent(this,ColorAdjustActivity.class);
    23           startActivity(intent);
    24           
    25           
    26       }

          好了,一切代码都完成了。我们赶紧运行,看看效果吧。左边为原图,右边为滑动seekBar时调整的效果。

                      

     

         滑动seekBar可以有不同的效果。如果你觉得还不过瘾,没关系。可以看我的下一篇文章《利用颜色矩阵实现图片效果》。但是请注意,在本篇实战中的代码要保存,因为在下一节中,我们仍旧要在这个基础上写代码。

         对了,还需要总结一下,在设置色相,饱和度和亮度时,我们用到了三个公式,即下面的代码:

    //获得色相的计算公式
     huge = (progress - MIDDLE_VALUE) * 1.0F / MIDDLE_VALUE * 180;
            
    //获得饱和度的计算公式
    sat = progress*1.0f/MIDDLE_VALUE;
                
    //获得亮度的计算公式
    um = progress*1.0f/MIDDLE_VALUE;

         其中progress是一个float的数值(0~255),MIDDLE_VALUE的值是127。这三个公式希望能记住,这是前辈们根据经验得到的。

     

    转载于:https://www.cnblogs.com/fuly550871915/p/4883422.html

    展开全文
  • 三原色,色值:光学三原色(红绿蓝),每个颜色可以使用0-255之间的数学来表达,色值。 rgb表示法: rgb(0,0,0)黑色 hex(16进制)表示法: #红绿蓝 淘宝红:#ffaa00,#f40 黑色:#000000,#000 白色:#ffffff,#fff ...
  • 【游戏仿真实验】使用Unity仿真电视机光学三原色显示画面,我是要成为海贼王的男人
  • 犹记得从小就听说有两种“三原色”,美术课上讲的“红黄蓝”和高中物理讲光学时的“红绿蓝”,一直很纠结是听美术老师的还是听物理老师的。现在真正搞计算机视觉了才发现,两个老师都正确,其实就体现了两种色彩混合...
  • PS制作三原色叠加效果教程

    千次阅读 2020-06-02 15:08:27
    我选的是A4纸,背景色一定要是透明或者其他颜色,一定不能是白色,否则使用图层滤色时会一片空白,然后再创建个图层,分别命名为红、绿、蓝,分别在个图层使用“椭圆选框工具”,固定大小,宽高分别700像素,...
  • 本书后面的篇幅将重点讲基于Matlab与FPGA的数字图像处理。但在正式开始之前,我们不得不再得巴拉巴拉一下,图像的成像原理。知其然要知其所以然,了解图像...颜色通常由个独立的分量来描述,相互综合得到最终的结果,
  • 然后把这些量度转换成数据,当显示器收到这些数据的时候就可以按照程序设定转换成制定的红、绿、蓝三原色,其实他们当中是有很多不同颜色的小色块的,由于这些色块的像素非常非常的小而且密密麻麻的,所以我们眼睛...
  • ② ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 ws2812 三原色灯(spi方式 稳定灯光)】 一、驱动ws2812遇到的问题 二、可能的方案 三、具体实现 四、测试程序 五、还没结束 ② ESP8266 开发学习笔记_By_GYC ...
  • 【图形和图像】三原色

    千次阅读 2016-11-03 14:49:36
    每一种感光色素主要对一种原色产生兴奋,而对其余两种原色光产生不同程度的反应 。如果某一种色素缺乏,则会产生对此颜色的感觉障碍,表现为色盲或色弱(辨别色力弱)。 颜色的要素  光作用于人眼,使之产生颜色...
  • 其实不难发现这应该是RGB三原色,我们就找个白色画布,把文件读进来。 运行代码之后可以在你设定的路径下得到一张图片。 public class test { public static void main(String[] args) throws IOException { ...
  • 程序实现了对位图图片各个像素点的提取并且在对话框中扫描出来 可以对24位位图和32位位图进行操作
  • 色深 我们最常看到的说明是,彩色影像是由蓝、绿、红三原色根据不同比例及加上亮度混合而成。 比如8位(8bit)即256*256*256=16.7百万色,同理6bit有26万色,10bit有10.7亿颜色组合。 简单来说就是色深越高过渡色彩就...
  • 需求:提取出图像特定黄瓜部分并得到其rgb三原色; 步骤: 首先确定黄瓜大概范围,将其它设置为背景颜色,也就是饱和度为0; 得到此时直方图,因为黄瓜是绿色的(所以它的g的饱和度较高,背景色的饱和度较底),...
  • 我们知道,只要是彩色都可用亮度、色调和饱和度来描述,人眼中看到的任一彩色光都是这个特征的综合效果。那么亮度、色调和饱和度分别指的是什么呢?
  • 1、理论依据 ...这里的图像颜色的调整是基于RGB三原色的,在OpenCV中(255,255,255)指的是白色,(0,0,0)为黑色,可以大致理解为值越大颜色越亮。 这里采用的力量公式为: g(x)=αf(x)+βg(x)
  • 3)上方选择“容差”:容许错误框选的像素点范围,可以选择小一点,10或者20左右 4)对图像的白色区域用魔术工具进行”单击“:即可选中白色区域部分 5)按”delete“即可对选中的白色区域进行删除,变成透明...
  • 像素

    2015-05-20 19:15:13
    维基百科-像素每个像素可有各自的颜色值,可采用三原色显示;单位面积内的像素越多代表分辨率越高,所显示的图像就会接近于真实物体。
  • 像素 1.1物理像素 手机屏幕横向有828个点 ...可见,每个像素就是一个点,每个点由红绿蓝三原色组成,只需要控制每个点每种颜色的明暗,就可以显示不同的颜色 实际开发中使用物理像素吗 同等屏幕大小的两个手机一...
  • css像素的应用原理

    2020-07-21 19:54:40
    rgb通过三原色在同一平面同时存在时,将被我们看到的就是白色。 但是在机器当中,很难实现将三种颜色放在在同一空间,所以计算机中实际通过空间混色法完成。 红、黄、蓝===>空间混色法 现有<div class="demo"&...
  • 访问像素:at()方法

    2019-09-24 18:05:53
    对于彩色图像,需要用三原色数据来重现不同的可见色,这是因为我们人类的视觉系统是三原色的,视网膜上有三种类型的视锥细胞,它们将颜色信息传递给大脑。这意味着对于彩色图像,每个像素都要对应三个数...
  • 机器感知 一个专注于SLAM、三维重建、机器视觉等相关技术文章分享的公众号 ...彩色图像由三通道像素组成, 每个通道表示红、 绿、 蓝三原色中一种颜色的亮度值, 每个数值都是8位的无符...
  • 可根据像素三原色的数值,识别图片中的不同颜色的区域,并计算特定颜色范围的面积。可用于计算无损检测C扫结果中的损伤面积。
  • 传统的RGB三原色使用红绿蓝三原色表示一个像素,每种原色占用一个字节(8bit),因此一个像素用RGB表示则需要8*3=24bit。 如果使用YUV表示这个像素,假设YUV的采样率为:4:2:0,即每一个像素对于亮度Y的采样频率为...
  • 从这篇博客开始,我们要踏上新的征程,我们要从像素的角度,来一起了解图像,一起了解OpenCV。今天这篇博客,我们讲最基本的图像像素操作,让我们一起,复习一下之前学的基本数据类型,然后一起走进今天的内容吧! ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,850
精华内容 3,540
关键字:

像素三原色