Skip to content

Commit c59dd1e

Browse files
committed
Add 05
1 parent 5bae0cd commit c59dd1e

File tree

1 file changed

+244
-0
lines changed

1 file changed

+244
-0
lines changed
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
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

Comments
 (0)