图像预处理主要包括去噪、对比度增强,去噪和对比度增强方法顺序不唯一,根据实际情况作出最好的安排。
1、灰度化
http://blog.sina.com.cn/s/blog_13c6397540102wqtt.html
那么什么叫图片的灰度化呢?其实很简单,就是让像素点矩阵中的每一个像素点都满足下面的关系:R=G=B(就是红色变量的值,绿色变量的值,和蓝色变量的值,这三个值相等,“=”的意思不是程序语言中的赋值,是数学中的相等),此时的这个值叫做灰度值。
灰度处理的方法:
一般灰度处理经常使用两种方法来进行处理。
方法1:
灰度化后的R=(处理前的R + 处理前的G +处理前的B)/ 3
灰度化后的G=(处理前的R + 处理前的G +处理前的B)/ 3
灰度化后的B=(处理前的R + 处理前的G +处理前的B)/ 3
方法2:
灰度化后的R =处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
灰度化后的G =处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
灰度化后的B =处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
2、高斯滤波、均值滤波、中值滤波、双边滤波(去噪)
https://blog.csdn.net/u013007900/article/details/78181249
高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1;而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小。
均值滤波及中值滤波的区别
均值滤波和和中值滤波都可以起到平滑图像,虑去噪声的功能。均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。中值滤波采用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择适当的点来替代污染点的值,所以处理效果好,对椒盐噪声表现较好,对高斯噪声表现较差。
http://www.360doc.com/document/18/0320/20/52973095_738813007.shtml
https://www.cnblogs.com/qiqibaby/p/5281743.html
双边滤波:
双边滤波是一种非线性滤波器,它可以达到保持边缘、降噪平滑的效果。和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布[1]。最重要的是,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(例如卷积核中像素与中心像素之间相似程度、颜色强度,深度距离等),在计算中心像素的时候同时考虑这两个权重。 公式1a,1b给出了双边滤过的操作,Iq为输入图像,Ipbf为滤波后图像:


双边滤波的核函数是空间域核与像素范围域核的综合结果:在图像的平坦区域,像素值变化很小,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;在图像的边缘区域,像素值变化很大,像素范围域权重变大,从而保持了边缘的信息。
(双边滤波算法)原理及实现:
https://blog.csdn.net/piaoxuezhong/article/details/78302920
3、gamma矫正
https://blog.csdn.net/w450468524/article/details/51649651
https://www.cnblogs.com/qiqibaby/p/5325193.html
(Gamma Correction,伽玛校正):所谓伽玛校正就是对图像的伽玛曲线进行编辑,以对图像进行非线性色调编辑的方法,检出图像信号中的深色部分和浅色部分,并使两者比例增大,从而提高图像对比度效果。计算机绘图领域惯以此屏幕输出电压与对应亮度的转换关系曲线,称为伽玛曲线(Gamma Curve)。
以传统CRT(Cathode Ray Tube)屏幕的特性而言,该曲线通常是一个乘幂函数,Y=(X+e)γ,其中,Y为亮度、X为输出电压、e为补偿系数、乘幂值(γ)为伽玛值,改变乘幂 值(γ)的大小,就能改变CRT的伽玛曲线。典型的Gamma值是0.45,它会使CRT的影像亮度呈现线性。使用CRT的电视机等显示器屏幕,由于对于 输入信号的发光灰度,不是线性函数,而是指数函数,因此必需校正


4、直方图均衡化
直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果。
直方图是表示数字图像中每一灰度出现频率的统计关系。直方图能给出图像灰度范围、每个灰度的频度和灰度的分布、整幅图像的平均明暗和对比度等概貌性描述。灰度直方图是灰度级的函数, 反映的是图像中具有该灰度级像素的个数, 其横坐标是灰度级r, 纵坐标是该灰度级出现的频率( 即像素的个数) pr( r) , 整个坐标系描述的是图像灰度级的分布情况, 由此可以看出图像的灰度分布特性, 即若大部分像素集中在低灰度区域, 图像呈现暗的特性; 若像素集中在高灰度区域, 图像呈现亮的特性。
图1所示就是直方图均衡化, 即将随机分布的图像直方图修改成均匀分布的直方图。基本思想是对原始图像的像素灰度做某种映射变换, 使变换后图像灰度的概率密度呈均匀分布。这就意味着图像灰度的动态范围得到了增加, 提高了图像的对比度。

①求该图像的灰度直方图。②对该图像进行直方图均衡化处理,写出过程和结果。
首先需要说明的是,如果你说的是一道完整的题目,则这道题目没有唯一解,因为题目中没有说明原始图像的灰度级数(比如原始图像是16个灰度级的,或者是32个灰度级的,等等)。为了给你提供一个解题思路,现在人为假设原始图像是16个灰度级的,其它灰度级的解法类似。
图像的灰度直方图求法为:
先计算图像中各个灰度级的出现频率,用h(i)表示灰度级i的出现频率,其值等于灰度级出现次数/图像像素个数:
h(0)=2/16,h(1)=1/16,h(2)=3/16,h(3)=2/16,h(4)=0/16
h(5)=1/16,h(6)=4/16,h(7)=1/16,h(8)=1/16,h(9)=1/16
h(10)=h(11)=h(12)=h(13)=h(14)=h(15)=0/16。
图像进行直方图均衡化处理的过程为:
先计算累积分布,用r(i)表示灰度级i的累积分布:
r(0)=h(0)=2/16
r(1)=r(0)+h(1)=2/16+1/16=3/16
r(2)=r(1)+h(2)=3/16+3/16=6/16
r(3)=r(2)+h(3)=6/16+2/16=8/16
r(4)=r(3)+h(4)=8/16+0/16=8/16
r(5)=r(4)+h(5)=8/16+1/16=9/16
r(6)=r(5)+h(6)=9/16+4/16=13/16
r(7)=r(6)+h(7)=13/16+1/16=14/16
r(8)=r(7)+h(8)=14/16+1/16=15/16
r(9)=r(8)+h(9)=15/16+1/16=16/16=1
r(10)=r(11)=r(12)=r(13)=r(14)=r(15)=1
将累积分布进行量化(量化时需要用到原始图像的灰度级数,这也是为什么前面需要说明的原因),量化后的灰度级用rq(i)表示,量化公式为rq(i)=ROUND(r(i)*15),(说明:量化公式中的15等于原始图像灰度级数减1),可得:
rq(0)=ROUND(r(0)*15)=2
rq(1)=ROUND(r(1)*15)=3
rq(2)=ROUND(r(2)*15)=6
rq(3)=ROUND(r(3)*15)=8
rq(4)=ROUND(r(4)*15)=8
rq(5)=ROUND(r(5)*15)=8
rq(6)=ROUND(r(6)*15)=12
rq(7)=ROUND(r(7)*15)=13
rq(8)=ROUND(r(8)*15)=14
rq(9)=ROUND(r(9)*15)=15
rq(10)=ROUND(r(10)*15)=15
rq(11)=ROUND(r(11)*15)=15
rq(12)=ROUND(r(12)*15)=15
rq(13)=ROUND(r(13)*15)=15
rq(14)=ROUND(r(14)*15)=15
rq(15)=ROUND(r(15)*15)=15
因此,原始图像中的灰度级和均化后图像中的灰度级之间的对应关系为:
0->2 1->3 2->6 3->8 4->8 5->8 6->12 7->13 8->14 9->15
10->15 11->15 12->15 13->15 14->15 15->15
#include
#include
#include
usingnamespacestd;
intmain(intargc,char** argv)
{
//载入图片
inti=0, j=0, temp=0;
IplImage * img = cvLoadImage("D:\\2.jpg", CV_LOAD_IMAGE_GRAYSCALE);//图片路径
intheight = img->height;
intwidth = img->width;
intstep = img->widthStep;
uchar *data = (uchar*)img->imageData;
floatsize = height*width;
//直方图
unsignedinthist[256] = {0};
for(i=0; i
{
for(j=0; j
{
temp = data[i*step+j];
hist[temp]++;
}
}
//归一化直方图
floathistPDF[256] = {0};
for(i=0; i<255; i++)
{
histPDF[i]=(float)hist[i]/size;
}
//累积直方图
floathistCDF[256] = {0};
for(i=0; i<256; i++)
{
if(0==i) histCDF[i] = histPDF[i];
elsehistCDF[i] = histCDF[i-1] + histPDF[i];
}
//直方图均衡化,映射
inthistEQU[256] = {0};
for(i=0; i<256; i++)
{
histEQU[i] = (int)(255.0* histCDF[i] +0.5);
}
for(i=0; i
{
for(j=0; j
{
temp = data[i*step+j];
data[i*step+j] = histEQU[temp];
}
}
cvNamedWindow("demo", CV_WINDOW_AUTOSIZE);
cvShowImage("demo", img);
cvWaitKey(0);
cvDestroyWindow("demo");
cvReleaseImage(&img);
return0;
}
5、线性变换
y=a*x+b的方式,其中x表示原图,y表示输出图像。
a=1,b=0,y和x相同
a>1对比度增强,a<1对比度减弱
b>0亮度增强,b<0亮度减弱
6、亮度、饱和度调整
https://blog.csdn.net/mao0514/article/details/47041099
通常在RGB色彩空间调整亮度与饱和度不是很直观,而HSL彩色空可以很直观表示出
每个像素的饱和度与亮度。所以首先读取图像的像素RGB值然后再转换到HSL空间得
到饱和度与亮度值,调整以后再从HSL空间转换到RGB空间的RGB值,对每个像素完
成这样的调整就完成图像的亮度与饱和度调整。
关于RGB与HSL色彩空间的转换
代码:http://lib.csdn.net/article/css3/52059

转换公式:

7、一种计算图像曝光度(Exposure)的方法
https://blog.csdn.net/grafx/article/details/45619731
下面是基于opencv的相关代码示例,strength范围可以设置为-2.0到2.0:
// strength范围[-2.0, 2.0]
int row = inputImg.rows;
int step = inputImg.step;
uchar* pInputImg = inputImg.data;
uchar* pOutputImg = outputImg.data;
for (int i = 0; i < row * step; i++)
{
pOutputImg[i] = (uchar)min_uchar(255, max_uchar(0, pInputImg[i] * pow(2, strength)));
}
网友评论