|
| 1 | +# Matlab实现彩色图像的转换、平滑、锐化与分割 |
| 2 | + |
| 3 | +## 目的 |
| 4 | + |
| 5 | +1. 使用 RGB、索引和灰度级图像间转换的函数 |
| 6 | +2. 掌握彩色图像平滑的MATLAB 仿真 |
| 7 | +3. 彩色图像锐化 |
| 8 | +4. RGB 彩色图像分割 |
| 9 | + |
| 10 | +## 内容 |
| 11 | + |
| 12 | +### 1.使用 RGB、索引和灰度级图像间转换的函数 |
| 13 | + |
| 14 | +```matlab |
| 15 | +clc |
| 16 | +f=imread('D:\pic\DIP3E_CH06\Fig0651(a)(flower_no_compression).tif'); |
| 17 | +imshow(f) |
| 18 | +title('原图像'); |
| 19 | +
|
| 20 | +[X1,map1]=rgb2ind(f,8,'nodither'); |
| 21 | +figure |
| 22 | +imshow(X1,map1);%无抖动处理的颜色数减少到8 的图像 |
| 23 | +title('无抖动处理的颜色数减少到8 的图像'); |
| 24 | +
|
| 25 | +[X2,map2]=rgb2ind(f,8,'dither'); |
| 26 | +figure |
| 27 | +imshow(X2,map2)%有抖动处理的颜色数减少到8 的图像 |
| 28 | +title('有抖动处理的颜色数减少到8 的图像'); |
| 29 | +
|
| 30 | +g=rgb2gray(f); |
| 31 | +g1=dither(g); |
| 32 | +figure,imshow(g); |
| 33 | +title('使用函数rgb2gray 得到的原图像的灰度级图像'); |
| 34 | +figure,imshow(g1); |
| 35 | +title('经抖动处理后的灰度图像(这是一幅二值图像)'); |
| 36 | +``` |
| 37 | + |
| 38 | +### 2.掌握彩色图像平滑的MATLAB 仿真 |
| 39 | + |
| 40 | +```matlab |
| 41 | +function hsi = rgb2hsi(rgb) |
| 42 | +
|
| 43 | +rgb=im2double(rgb); |
| 44 | +r=rgb(:,:,1); |
| 45 | +g=rgb(:,:,2); |
| 46 | +b=rgb(:,:,3); |
| 47 | +
|
| 48 | +num=0.5*((r-g)+(r-b)); |
| 49 | +den=sqrt((r-g).^2+(r-b).*(g-b)); |
| 50 | +theta=acos(num./(den+eps)); |
| 51 | +
|
| 52 | +H=theta; |
| 53 | +H(b>g)=2*pi-H(b>g); |
| 54 | +H=H/(2*pi); |
| 55 | +
|
| 56 | +num=min(min(r,g),b); |
| 57 | +den=r+g+b; |
| 58 | +den(den==0)=eps; |
| 59 | +S=1-3.*num./den; |
| 60 | +
|
| 61 | +H(S==0)=0; |
| 62 | +I=(r+g+b)/3; |
| 63 | +
|
| 64 | +hsi=cat(3,H,S,I); |
| 65 | +
|
| 66 | +function rgb=hsi2rgb(hsi) |
| 67 | +H=hsi(:,:,1)*2*pi; |
| 68 | +S=hsi(:,:,2); |
| 69 | +I=hsi(:,:,3); |
| 70 | +
|
| 71 | +R=zeros(size(hsi,1),size(hsi,2)); |
| 72 | +G=zeros(size(hsi,1),size(hsi,2)); |
| 73 | +B=zeros(size(hsi,1),size(hsi,2)); |
| 74 | +
|
| 75 | +idx=find((0<=H)&(H<2*pi/3)); |
| 76 | +B(idx)=I(idx).*(1-S(idx)); |
| 77 | +R(idx)=I(idx).*(1-S(idx).*cos(H(idx))./cos(pi/3-H(idx))); |
| 78 | +G(idx)=3*I(idx)-(R(idx)+B(idx)); |
| 79 | +
|
| 80 | +idx=find((2*pi/3<=H)&(H<4*pi/3)); |
| 81 | +R(idx)=I(idx).*(1-S(idx)); |
| 82 | +G(idx)=I(idx).*(1+S(idx).*cos(H(idx)-2*pi/3)./cos(pi-H(idx))); |
| 83 | +B(idx)=3*I(idx)-(R(idx)+G(idx)); |
| 84 | +
|
| 85 | +idx=find((4*pi/3<=H)&(H<=2*pi)); |
| 86 | +G(idx)=I(idx).*(1-S(idx)); |
| 87 | +B(idx)=I(idx).*(1+S(idx).*cos(H(idx)-4*pi/3)./cos(5*pi/3-H(idx))); |
| 88 | +R(idx)=3*I(idx)-(G(idx)+B(idx)); |
| 89 | +
|
| 90 | +rgb=cat(3,R,G,B); |
| 91 | +rgb=max(min(rgb,1),0); |
| 92 | +
|
| 93 | +%%%%%%%%%%%主函数——图像平滑 |
| 94 | +
|
| 95 | +clear all |
| 96 | +clc |
| 97 | +fc=imread('D:\pic\DIP3E_CH06\Fig0637(a)(caster_stand_original).tif'); |
| 98 | +imshow(fc) |
| 99 | +h=rgb2hsi(fc); |
| 100 | +H=h(:,:,1);%显示h 分量图像 |
| 101 | +figure,imshow(H) |
| 102 | +title('H 分量') |
| 103 | +S=h(:,:,2); |
| 104 | +title('S 分量') |
| 105 | +figure,imshow(S) |
| 106 | +I=h(:,:,3); |
| 107 | +figure,imshow(I) |
| 108 | +title('I 分量') |
| 109 | +w=fspecial('average',25); |
| 110 | +I_filtered=imfilter(I,w,'replicate'); |
| 111 | +h=cat(3,H,S,I_filtered); |
| 112 | +f=hsi2rgb(h); |
| 113 | +figure,imshow(f) |
| 114 | +f=min(f,1);%RGB images must have values in the range[0,1] |
| 115 | +figure,imshow(f) |
| 116 | +``` |
| 117 | + |
| 118 | +### 3.彩色图像锐化 |
| 119 | + |
| 120 | +```matlab |
| 121 | +clear all |
| 122 | +clc |
| 123 | +fc=imread('D:\pic\DIP3E_CH06\Fig0637(a)(caster_stand_original).tif'); |
| 124 | +imshow(fc) |
| 125 | +
|
| 126 | +lapmask=[1 1 1;1 -8 1;1 1 1]; |
| 127 | +fen=imsubtract(fc,imfilter(fc,lapmask,'replicate')); |
| 128 | +figure,imshow(fen) |
| 129 | +``` |
| 130 | + |
| 131 | +### 4.RGB 彩色图像分割 |
| 132 | + |
| 133 | +```matlab |
| 134 | +function [C,m]=covmatrix(X) |
| 135 | +
|
| 136 | +[K,n]=size(X); |
| 137 | +X=double(X); |
| 138 | +if n==1 |
| 139 | + C=0; m=x; |
| 140 | +else |
| 141 | + m=sum(X,1)/K; |
| 142 | + X=X-m(ones(K,1),:); |
| 143 | + C=(X'*X)/(K-1); |
| 144 | + m=m'; |
| 145 | +end |
| 146 | +
|
| 147 | +function I=colorseg(varargin) |
| 148 | +
|
| 149 | +f=varargin{2}; |
| 150 | +if(ndims(f)~=3)|(size(f,3)~=3) |
| 151 | + error('Input image must be RGB!'); |
| 152 | +end |
| 153 | +M=size(f,1); N=size(f,2); |
| 154 | +[f,L]=imstack2vectors(f); |
| 155 | +f=double(f); |
| 156 | +I=zeros(M*N,1); |
| 157 | +T=varargin{3}; |
| 158 | +m=varargin{4}; |
| 159 | +m=m(:)';%make sure that m is a row vetor |
| 160 | +if length(varargin)==4 |
| 161 | + method='euclidean'; |
| 162 | +elseif length(varargin)==5 |
| 163 | + method='mahalanobis'; |
| 164 | +else |
| 165 | + error('wrong number of inputs!'); |
| 166 | +end |
| 167 | +switch method |
| 168 | + case 'euclidean' |
| 169 | + p=length(f); |
| 170 | + D=sqrt(sum(abs(f-repmat(m,p,1)).^2,2)); |
| 171 | + case 'mahalanobis' |
| 172 | + C=varargin{5}; |
| 173 | + D=mahalanobis(f,C,m); |
| 174 | + otherwise |
| 175 | + error('Unknown segmentation method!'); |
| 176 | +end |
| 177 | +
|
| 178 | +J=find(D<=T); |
| 179 | +I(J)=1; |
| 180 | +I=reshape(I,M,N); |
| 181 | +
|
| 182 | +function [X,R]=imstack2vectors(S,MASK) |
| 183 | +[M,N,n]=size(S); |
| 184 | +if nargin==1 |
| 185 | + MASK=true(M,N); |
| 186 | +else |
| 187 | + MASK=MASK~=0; |
| 188 | +end |
| 189 | +[I,J]=find(MASK); |
| 190 | +R=[I,J]; |
| 191 | +Q=M*N; |
| 192 | +X=reshape(S,Q,n); |
| 193 | +MASK=reshape(MASK,Q,1); |
| 194 | +X=X(MASK,:); |
| 195 | +
|
| 196 | +
|
| 197 | +%%%%%%RGB 图像分割主程序 |
| 198 | +clear all |
| 199 | +clc |
| 200 | +f=imread('D:\pic\DIP3E_CH06\Fig0637(a)(caster_stand_original).tif'); |
| 201 | +mask=roipoly(f); |
| 202 | +figure,imshow(mask)%mask 是一幅2 值图像(大小与f 相同) |
| 203 | +red=immultiply(mask,f(:,:,1)); |
| 204 | +figure,imshow(red) |
| 205 | +title('red 分量'); |
| 206 | +
|
| 207 | +green=immultiply(mask,f(:,:,2)); |
| 208 | +figure,imshow(green) |
| 209 | +title('green 分量'); |
| 210 | +
|
| 211 | +blue=immultiply(mask,f(:,:,3)); |
| 212 | +figure,imshow(blue) |
| 213 | +title('blue 分量'); |
| 214 | +g=cat(3,red,green,blue); |
| 215 | +figure,imshow(g) |
| 216 | +
|
| 217 | +%计算ROI 中的点的均值向量和协方差矩阵 |
| 218 | +[M,N,K]=size(g); |
| 219 | +I=reshape(g,M*N,3); |
| 220 | +idx=find(mask); |
| 221 | +I=double(I(idx,1:3)); |
| 222 | +[C,m]=covmatrix(I); |
| 223 | +
|
| 224 | +d=diag(C); |
| 225 | +sd=sqrt(d)' |
| 226 | +E25=colorseg('euclidean',f,25,m); |
| 227 | +%colorseg('m',f,T,m)T 值可取的值为25 的倍数时得到的不同结果 |
| 228 | +``` |
| 229 | + |
| 230 | + |
| 231 | + |
| 232 | +参考文献: |
| 233 | + |
| 234 | +[1] [Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA.](https://github.com/timerring/digital-image-processing-matlab/blob/main/reference/Digital_Image_Processing_Using_Matlab.pdf) |
| 235 | + |
| 236 | +[2] [阮秋琦. 数字图像处理(MATLAB版)\[M\]. 北京:电子工业出版社, 2014.](https://github.com/timerring/digital-image-processing-matlab/blob/main/reference/Digital_Image_Processing_(MATLAB_version).pdf) |
| 237 | + |
| 238 | +[3] [冈萨雷斯. 数字图像处理(第三版)\[M\]. 北京:电子工业出版社, 2011.](https://github.com/timerring/digital-image-processing-matlab/blob/main/reference/Digital_Image_Processing_(Third_Edition).pdf) |
| 239 | + |
| 240 | + |
| 241 | + |
| 242 | + |
| 243 | + |
| 244 | +[返回首页](https://github.com/timerring/digital-image-processing-matlab) |
0 commit comments