第六章(5至6节) 彩色图像处理

来源:互联网 发布:淘宝云标签网址 编辑:程序博客网 时间:2024/06/05 13:21

  • 彩色图像锐化
  • 在RGB向量空间直接处理
    • 1 采用梯度的彩色边缘检测

1. 彩色图像锐化

用线性空间滤波器锐化一幅RGB彩色图像的基本步骤和第三章学过的差不多,但使用的是锐化滤波器,我们考虑使用的还是拉普拉斯算子锐化图像。

代码如下:

h=imread('C:\Users\sh qian\Desktop\flower.jpg');lapmask=[1 1 1;1 -8 1;1 1 1];filter=imfilter(h,lapmask,'replicate');fen=imsubtract(h,filter);imshow(fen);figure,imshow(h);subplot(1,2,1),imshow(h);title('原图');subplot(1,2,2),imshow(fen);title('经过锐化后的图像');

效果如下:

这里写图片描述

在使用imfilter时,RGB图像完全可以当做单色图像处理,避免了对分量的拆分和合并,imsubtract函数表示相减,因为锐化重要的一步就是原图像与经过滤波后的图像进行相减。

2. 在RGB向量空间直接处理

2.1 采用梯度的彩色边缘检测

我在书中的附录里找到了实现RGB图像的彩色梯度的函数,我理解的大概意思是,根据传入的(一定是)RGB图像,以及一个Sobel掩膜sh,因为sh是近似于垂直方向的梯度,所以还需要一个水平方向的掩膜sh’。然后对这个RGB图像进行分通道滤波,而且要在垂直和水平方向分别滤波。接下来,就是一系列的数学公式的推导(还得慢慢理解吧),最后计算每个平面的梯度。

colorgrad函数代码如下:

function [VG,A,PRG]=colorgrad(f,T)if ndims(f)~=3  ||  size(f,3) ~=3    error('Input image must be RGB');endsh=fspecial('sobel');sv=sh';Rx=imfilter(double(f(:,:,1)),sh);Ry=imfilter(double(f(:,:,1)),sv);Gx=imfilter(double(f(:,:,2)),sh);Gy=imfilter(double(f(:,:,2)),sv);Bx=imfilter(double(f(:,:,3)),sh);By=imfilter(double(f(:,:,3)),sv);gxx=Rx.^2+Gx.^2+Bx.^2;gyy=Ry.^2+Gy.^2+By.^2;gxy=Rx.*Ry+Gx.*Gy+Bx.*By;A=0.5*(atan(2*gxy./(gxx-gyy+eps)));G1=0.5*((gxx+gyy)+(gxx-gyy).*cos(2*A)+2*gxy.*sin(2*A));A=A+pi/2;G2=0.5*((gxx+gyy)+(gxx-gyy).*cos(2*A)+2*gxy.*sin(2*A));G1=G1.^0.5;G2=G2.^0.5;VG=mat2gray(max(G1,G2));%计算每个平面的梯度RG=sqrt(Rx.^2+Ry.^2);GG=sqrt(Gx.^2+Gy.^2);BG=sqrt(Bx.^2+By.^2);PRG=mat2gray(RG+GG+BG);if nargin==2    VG=(VG>T).*VG;    PRG=(PRG>T).*PRG;end

测试例子

c=imread('tem.jpg');[VG,A,PPG]=colorgrad(c);figure,imshow(VG);figure,imshow(PPG);subplot(2,2,3),imshow(b);title('原图');imhist(PPG,255);imhist(VG,255);title('VG直方图');subplot(2,2,4),imhist(PPG,255);title('PPG直方图');

效果如图:

这里写图片描述

其实正常情况下PPG图像的水平边缘比VG中的对应边缘更弱,主要原因是红色和绿色平面的梯度产生两个垂直边缘,蓝色平面的梯度产生单个水平边缘。为形成PPG而相加这三个梯度会产生亮度两倍于水平边缘亮度的垂直边缘。

原创粉丝点击