一、全局对比度增强
1
1. 直方图均衡化 Histogram Equalization a. 基本思想 对于图像中的灰度点做映射,使得整体图像的灰度大致符合均匀分布。增强图像的对比度。 – 对于灰度值连续的情况,使用灰度的累积分布函数CDF做转换函数,可以使得输出图像的灰度符合均匀分布。 – 对于灰度值不连续的情况,存在舍入误差,得到的灰度分布大致符合均匀分布。 – 直观地理解,如果某一个灰度范围(如200-201)的像素点很少,那么它的概率密度值就会很小,所以CDF在200-201附近的增长变化就会很小;反之,如果某一个灰度范围(如100-101)的像素点很多,CDF在100-101附近的增长变化会很大。总体来看,以灰度为横轴,CDF为纵轴画曲线。这种向上凸的曲线,很像gamma变换: s=crγ
中
γ<1
的情形。将灰度集中的部分拉伸,而将灰度不集中的部分压缩,达到提高对比度的效果。 – 直方图均衡可以看做自适应的gamma变换或者分段变换。前者的优势在于,不需要指定任何参数,所有运算都是基于图像本身的。
b. 算法 根据图像灰度计算灰度概率密度函数
PDF
计算累积概率分布函数
CDF
将
CDF
归一化到原图灰度取值范围,如[0,255]。 之后
CDF
四舍五入取整,得到灰度转换函数
sk=T(rk)
将
CDF
作为转换函数,将灰度为
rk
的点转换为
sk
灰度 c. matlab实验 代码
2
:
%% 直方图均衡 clear all;clc;close all; ImgFile='E:\图像处理\冈萨雷斯图片库\DIP3E_Original_Images_CH03\Fig0310(b)(washed_out_pollen_image).tif'; ImgIn=imread(ImgFile); ImgHistEq=histeq(ImgIn,256); figure;subplot(121);imshow(uint8(ImgIn));title('原图'); subplot(122);imshow(ImgHistEq);title('全局灰度增强 - 直方图均衡'); figure;subplot(121);imhist(ImgIn,256); axis([0 255 0 1e5]);title('原图的直方图'); subplot(122);imhist(ImgHistEq,256);axis([0 255 0 1e5]);title('直方图均衡化后的直方图'); % 自定义直方图均衡 [counts,x]=imhist(ImgIn,256); cum_counts=cumsum(counts); cum_counts=uint8(cum_counts/max(cum_counts)*255);% 转化函数 figure;plot(x,cum_counts);axis([0 255 0 255]); xlabel('原图灰度');ylabel('转换后灰度');title('原图CDF转化的灰度映射函数'); ImgOut=nan(size(ImgIn)); for i=1:length(x) ImgOut(ImgIn==x(i))=cum_counts(i); end ImgOut=uint8(ImgOut); figure;imshow(uint8(ImgOut));title('自定义直方图均衡') figure;imhist(ImgOut,256);axis([0 255 0 1e5]);title('自定义直方图均衡的直方图') 输出: 图1.
最近刚开始学数字图像处理,在看到灰度级时候以为灰度只是表示黑白/深浅色图像,其实灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真。
注意,灰度值只是表征单色的亮暗程度。
在彩色图像/RGB图像中,图像是一个三维矩阵,如4003003,其中400表示列数,300表述行数,3代表三个分量,也就是R,G,B。
每一层矩阵(4003001/2/3)分别对应R/G/B的灰度值,此处的矩阵仅仅表示对应单色光灰度值,不是彩色的图像。
数字图像的本质是一个多维矩阵
我们先为以一个RGB色彩空间的400*300的图片为例:
这幅图的本质是一个4003003的一个矩阵
PI[ 400, 300, 3 ]
列 行 分量
说明这个图像有400列,300行,以及在色彩上有三个分量,分别是:
每个分量单独拿出来都是一个400*300(*1)的矩阵
如你所见,它们并不是彩色的,而是一幅灰度图像
对于一副8bit的图像来说,矩阵元素的取值范围是从0-255(0 – 2^8-1)
矩阵中的元素对应我们所说的像素(pixel),其值即该像素的灰度值,数值越大,像素的颜色越‘白/浅’;数值越小,像素的颜色越’黑/深‘
对于图像每个分量来说,它只是灰度,谈论色彩没有意义,它是“黑白”的!(用黑白来描述灰度图像并不准确,用深浅可能更准确一些,但也不严谨。所以我加上了引号。你要愿意把通道设成红色绿色紫色黄色都行)
在图像显示时,我们把图像的R分量放进红色通道里,B分量放进蓝色通道里,G分量放进绿色通道里。经过一系列处理,显示在屏幕上的就是我们所看到的彩色图像了。
所以说,通道和一幅图像根本就没关系!数字图像是矩阵,矩阵只描述其空间位置和在色彩上的分量,哪有通道了?通道是什么?CHANNEL!图片中有channel这个概念吗?有个回答说通道类似颜料,这个意思就有点接近了。
想要什么颜色,对应的通道里的灰度值就大一点就行了
回到上面那幅图,先看彩色的,两人坐的椅子是红色的(有点偏色,不过不重要)
再看下面的RGB三分量。R分量的图上,椅子对应的部分比较浅(灰度值高),而在G分量和了B分量上很深。
随便在椅子上取一个样点,其灰度值分别是(R:179,G:45,B:9)。所以在显示的时候,红色通道里灰度值大,绿色通道和蓝色通道里的灰度值小,显示出来的就是红色(绿色通道里的灰度值又比蓝色大一些,所以最终显示的结果有点接近橘红色)
再看乔帮主的牛仔裤,蓝色通道的灰度值大,绿色其次,红色最少,所以显示为蓝青色。
如果我们交换一下分量放置的顺序,把G分量放进红色通道里,把R分量放进绿色通道里,B分量放进蓝色通道里,会怎么样呢
此时绿通道中的灰度值最大,红色通道和蓝色通道中的灰度值都较低
于是就变成了这样
[外链图片转存失败(img-jgutNY7F-1568455078494)(https://img-blog.csdn.net/20161221185547020?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsZW5jZTIwMTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
还可以这样变成蓝色了
能理解这种交换通道的原理,就基本能够理解通道的含义了
网上很多人把通道和选区混为一谈,这是错误的,不利于对图像处理更深一步的理解。当然在ps中有个通道混合器,不仅仅是交换通道这么简单,玩法更加丰富
这里只介绍了RGB模式下的通道。
这些所谓的xxx模式,其实就是把我们看到的颜色,用不同的方式表达出来。我们熟知的RGB色彩空间,就是把一种颜色,用RGB三个分量表达出来。此外还有CMYK(四个分量)、Lab(三个)、HSV(三个)等等。不同色彩空间之间的关系,类似于空间直角坐标系(x,y,z),球坐标系(r,φ,θ)或柱坐标(r,φ,z)之间的关系。
此外还有一些特殊的通道,如alpha通道(存放透明度)等
上面的例子引自知乎 嗜睡者知乎原链接
1. 黑白二值图:只由黑点和白点组成,表现出灰色图象的效果。黑点越多,图像就暗点,反之,图像就亮点。
2. 半影调技术:由二值图象显示出灰度效果的方法。它的一个主要用途就是在只有二值输出的打印机上打印图象。主要的两种方法:图案法和抖动法。
4.1 图案法
1. 图案法是指灰度可以用一定比例的黑白点组成的区域表示,从而达到整体图象的灰度感。黑白点的位置选择称为图案化。
2. 分辨率,单位是dpi(dot per inch),即每英寸点数,点数越多,分辨率就越高,图象就越清晰。显示器的尺寸(英寸)是指对角线。
3. 像素点灰度的表示方法(图案):如果这16×16的方块中一个黑点也没有,就可以表示灰度256;有一个黑点,就表示灰度255;依次类推,当都是黑点时,表示灰度0。这样,16×16的方块可以表示257级灰度。
4. 图案的构成:有规则的图案和随机的图案。一般情况下,有规则的图案比随即图案能够避免点的丛集,但有时会导致图象中有明显的线条。
5. 标准图案:一个整数矩阵。例如要表示256级灰度,则其中的每个值从0到255。图象的实际灰度和阵列中的每个值比较,当该值大于等于灰度时,对应点打一黑点。
6. 设计标准图案的算法:(由Limb在1969年提出的)
先以一个2×2的矩阵开始:设M1= ,通过递归关系有Mn+1= ,其中Mn和Un均为2n×2n的方阵,Un的所有元素都是1。根据这个算法,可以得到M2= ,为16级灰度的标准图案。
M3(8×8阵)比较特殊,称为Bayer抖动表。M4是一个16×16的矩阵。
7. 在不改变原图的大小下,使用利用图案化技术:设原图是256级灰度,利用Bayer抖动表,做如下处理:
if (g[y][x]>>2) > bayer[y&7][x&7] then 打一白点 else 打一黑点
其中,x,y代表原图的象素坐标,g[y][x]代表该点灰度。首先将灰度右移两位,变成64级,然后将x,y做模8运算,找到Bayer表中的对应点,两者做比较,根据上面给出的判据做处理。模8运算使得原图分成了一个个8×8的小块,每个小块和8×8的Bayer表相对应。
4.2 抖动法
1. 规则抖动:如上面提到Bayer表算法。优点是算法简单;缺点是图案化有时很明显,这是因为取模运算虽然引入了随机成分,但还是有规律的。
2. Floyd-Steinberg算法:
假设灰度级别的范围从b(black)到w(white),中间值t为(b+w)/2,对应256级灰度,b=0,w=255,t=127.5。设原图中象素的灰度为g,误差值为e,则新图中对应象素的值用如下的方法得到:
if g > t then
打白点
e=g-w
else 打黑点
e=g-b
3/8 × e 加到右边的象素
3/8 × e 加到下边的象素
1/4 × e 加到右下方的象素
但在这个算法中,因为e有可能是负数,为了防止得到的值超出char能表示的范围,我们使用了一个int类型的缓冲区存储新值。
要注意的是,误差传播有时会引起流水效应,即误差不断向下,向右累加传播。解决的办法是:奇数行从左到右传播,偶数行从右到左传播。
4.3 将bmp文件转换为txt文件