图像的点运算
———————————————————————————————
———————————————————————————————
图像的点运算主要用于改变一幅图像的灰度分布范围,点运算通过变换函数将图像的像素一一转换,最终构成一副新的图像。点运算的最大特点是输出像素值只与当前输入像素值有关。
g(x,y)=T[f(x,y)]
f(x,y)表示输入图像,g(x,y)表示输出图像。函数T是对f的一个变换操作,表示灰度变换公式。
一、灰度直方图(imhist)
灰度直方图是一个二维图,其横坐标表示图像的灰度值,取值范围是0~255,其纵坐标则通过高度来表示出现次数的多少或者概率的高低。
I=imread('lena.jpg');
a = rgb2gray(I);
subplot(121);
imshow(f);
subplot(122);
imhist(f,256);
- 对于高亮度图像,整个画面的颜色偏亮,故灰度直方图偏向灰度高的一侧。相反,低亮度图像的直方图则偏向灰度较低的一侧。
- 在高对比图像的直方图中,灰度的覆盖范围很广。图像在任意一段灰度范围中都有一定的像素数量。同时,高对比图像的灰度分布相比其他图像而言较为均匀,整个直方图显得比较平滑。而低对比度图像的灰度则主要分布在中间狭窄的区域,图像效果就像被冲淡了一样。
二、灰度线性变换(imadjust)
灰度线性变换就是将图像的像素值通过指定的线性函数进行变换,以此增强或者减弱图像的灰度。灰度线性变换的公式就是常见的一维线性函数。
g(x,y)=k*f(x,y)+d
设x为原始灰度值,则变换后的灰度值y为: y=kx+d (0<=y<=255)
- 当k>1时,增加图像的对比度;
- 当k=1时,调节图像亮度;
- 当0<k<1时,图像对比度和整体效果都被消弱了;
- 当k<0时,源图像较亮的区域变暗,而较暗的区域会变亮。
I=imread('lena.jpg');
f = rgb2gray(I);
subplot(321);
imshow(f);
subplot(322);
imhist(f,256);
g1=imadjust(f,[0 1],[1 0]); %灰度转换,实现明暗转换(负片图像)
subplot(323);
imshow(g1);
subplot(324);
imhist(g1,256);
g2=imadjust(f,[0.5 0.75],[0 1]); %将0.5到0.75的灰度级扩展到范围[0 1]
subplot(325);
imshow(g2)
subplot(326);
imhist(g2,256);
三、灰度非线性变换
非线性变换包括:对数变换,幂次变换、指数变换等。
1、灰度对数变换(log)
扩展低灰度值而压缩高灰度值,让图像的灰度分布更加符合人的视觉特征。
I = imread('lena.jpg');
subplot(121);
imshow(I);
h=log(1+double(I)); %对输入图像做对数映射变换
h=mat2gray(h); %将矩阵h转换为灰度图片
h=im2uint8(h); %将灰度图转换为8位图
subplot(122);
imshow(h);
2、灰度幂次变换
幂次变换将部分灰度区域映射到更宽的区域中。
f=imread('liang.jpg');
g=double(f).^10;
figure();
subplot(1,2,1);imshow(f,[]);
subplot(1,2,2);imshow(g,[]);
3、灰度指数变换(exp)
指数变换的作用是拓展图像的高灰度级,压缩低灰度级。
I = imread('pout.tif');
J = im2double(I); %由于I属于uint型,在进行log或指数运行时,须变换成double型
%指数型 y = e^(-0.5*x + 3)
K2 = exp(-0.5.*J + 3);
K2 = uint8(K2);
figure;
subplot(221);imshow(I);title('原图');
subplot(222);imhist(I);title('原图的灰度直方图')
subplot(223);imshow(K2,[]);title('曲线型变换后的图像')
subplot(224);imhist(K2);title('曲线型变换后图像的灰度直方图')
四、灰度阈值变换(im2bw)
阈值,又称为临界值,它的目的是要确定出一个范围,然后这个范围内的部分使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或者保持原样。
轮廓线提供了一个确立图像中简单物体的边界的有效的方法。使用轮廓线作为边界的技术被称为阈值化。
灰度阈值变换(二值化),带来噪点,边缘误差
I=imread('lena.jpg');
thresh=graythresh(I); %自适应确定阈值,利用最大类间方差法找到图片的一个合适的阈值
bwl=im2bw(I,thresh);%二值化
imshow(bwl);
五、灰度拉伸
对图像的灰度进行拉伸使其覆盖较大的取值区间,从而提高图像的对比度以便观察。
灰度拉伸又叫做对比度拉伸,它与线性变换有些类似,不同之处在于灰度拉伸使用的是分段线性变换,所以它最大的优势是变换函数可以由用户任意合成。
灰度拉伸需要指定控制点,控制灰度拉伸变换函数的图形。
I=imread('lena.jpg');
J=rgb2gray(I); %输入图像转化为灰度图像
subplot(2,2,1),imshow(J),title('原始灰度图');
subplot(2,2,2),imhist(J),title('原始灰度直方图');
K=imadjust(J); %灰度拉伸,使用函数imadjust
%K=imadjust(I,[low_in high_in],[low_out high_out])
subplot(2,2,3),imshow(K);
subplot(2,2,4),imhist(K),title('拉伸灰度直方图');
另一例子:
六、灰度均衡(histeq)
灰度均衡是是以累计分布函数变换为基础的直方图修正法,它可以产生一幅灰度级分布概率均匀的图像。
直方图均衡化优点是能自动增强整体图像的对比度,但是它的具体增强效果却不易控制,处理的结果总是得到全局均衡化的直方图。
g=imread('liang.jpg');
f=rgb2gray(g);
h1=imhist(f,256); %直方图
h2=histeq(f,256); %histeq均衡后得到的图像
figure(1)
subplot(2,2,1);imshow(f); %灰度图
subplot(2,2,2);plot(h1); %直方图
subplot(2,2,3);imshow(h2); %均衡后得到的图像
subplot(2,2,4);imhist(h2); %均衡后得到的直方图
七、直方图匹配(规定化)
直方图规定化可以有选择的增强某个灰度值范围内的对比度或使图像灰度值的分布满足特定的要求。
g=imread('lena.jpg');
I=rgb2gray(g);
c=imread('liang.jpg');
Imatch=rgb2gray(c);
Jmatch=imhist(Imatch);%获取匹配图像直方图
Iout=histeq(I,Jmatch);%直方图匹配
figure; %显示原图像、匹配图像和匹配后的图像
subplot(1,3,1),imshow(I);title('原图像');
subplot(1,3,2),imshow(Imatch);title('匹配图像');
subplot(1,3,3),imshow(Iout);title('匹配之后图像');
figure; %显示原图像、匹配图像和匹配后图像的直方图
subplot(3,1,1),imhist(I,64);title('原图像直方图');
subplot(3,1,2),imhist(Imatch,64);title('匹配图像图像直方图');
subplot(3,1,3),imhist(Iout,64);title('匹配之后图像直方图');
详情参考博文:https://blog.csdn.net/majinlei121/article/details/46575351?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160386734519724813230205%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160386734519724813230205&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-2-46575351.pc_search_result_cache&utm_term=%E5%9B%BE%E5%83%8F%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%8C%B9%E9%85%8D%E8%A7%84%E5%AE%9A%E5%8C%96&spm=1018.2118.3001.4187