接上文清逸:MATLAB图像处理之图像增强一zhuanlan.zhihu.com
一,直接灰度变换
1.灰度线性变换
见图像增强一
2.灰度的非线性变换
度的非线性变换简称非线性变换,是指由D' = T(D)这样一个非线性单值函数所确定的灰度变换。这里主要讨论实际应用中经常使用的对数变换。对数变换常用来扩展低值灰度,压缩高值灰度,这样可以使低值灰度的图像细节更容易看清,从而达到图像增强的效果。对数变换曲线如图所示
其表达式为:
D'=C* log(1+|D|)
利用如上的对数变换曲线,编写程序对图像进行变换:
J=imread('c.jpg');
I=rgb2gray(J);
colormap;imshow(I);
M=double(I);
H=45*log(M+1);
E=uint8(H);
figure,subimage(E)变换前(左)后(右)图像对比
二,直方图灰度变换
直方图灰度变换是最常用的实现图像灰度变换的方法,值得我们重点讨论。
我们还是重点来学习直方图灰度变换用到的函数以及实现的代码和达到的效果:
实现函数
imhist函数用来计算和显示图像的直方图
imhist(I)
imhist(I,n) %I代表灰度图像,n为指定的灰度级数目,默认值为256
imhist(X,map) %X为索引图像
程序代码如下:
J=imread('c.jpg');
I=rgb2gray(J);
imshow(I);
figure,imhist(I)
效果图
上面的处理想必大家都已经烂熟于心了,我们重点来看怎样通过直方图进行灰度变换。
改变直方图的形状
我们可以通过改变直方图的形状来达到增强图像对比度的效果,该方法以概率论为基础,实际上,改变直方图形状的常用方法就是我们前面文章里面讲的直方图的均衡化。清逸:MATLAB中的直方图处理及均衡化zhuanlan.zhihu.com
你看吧,知识都是相通的,我们后面的内容都是以前面的为基础的,只不过前一篇文章阐述的层次是停留在学生实验的水平,这里我们会深入讲解改变直方图形状的方法。
我们还是用到了对比度调整函数imadjust
其调用格式为:
J = imadjust(I,[low_in high_in],[low_out high_out],γ)
灰度图像I转化为图像J,使值low-in 到high _in 与从low_ out 到high out 相匹配,大于high _in 或小于low_ in 的值将被减去,即小于low_ in 的值与low_out 相匹配,大于high-in的值与high_ out 相匹配。它们的默认值为[0,1]。 y用来指定描述I和J值关系曲线的形状; γ1时,输入越亮,输出值越减弱;默认时γ=1,表示线性变换。
图中给出了y值不同时对应的校正函数曲线。
举个例子:
执行以下程序
J=imread('c.jpg');
I=rgb2gray(J);
imshow(I);
H=imadjust(I,[0.15 0.9],[0 1]);
imshow(H);
figure,imhist(I,64);
对比两幅图像,经过变换的图像覆盖了整个灰度范围,其中,imadjust( )函数的第二个向量[0.15, 0.9]指定需要映射的灰度值范围,第三个向量[0 1]指定希望映射到的灰度值范围,即灰度值0.15映射到输出图像中的0,灰度值0.9映射到输出图像中的1.
除了增强或减弱图像的对比度外,还哥以对图像的灰度范围进行映射。
以下程序代码示例就是用imadjus( )函数将输入图像的灰度范围从[0 51]映射到[128 255]
J=imread('c.jpg');
I=rgb2gray(J);
imshow(I);
H=imadjust(I,[0 0.2],[0.5 1]);
imshow(H);
可以看到,图像的亮度显著的增强了,上述操作也可使原始图像灰暗部分的动态变化范围大大增加,从而使细节更容易观看。
总结一下直方图灰度变换要注意的事项:
1.观察图像的直方图,判断灰度范围。
2.将灰度范围转换为0~1之间的小数,使得灰度范围可以通过向量[low_ in high _in]传递给函数
此外,参数γ对图像修正的效果有良好的改善,大家可以加入这个参数自行观察效果。