说明:1.将颜色的RGB值用颜色编号表示:Z =floor(R/16) *256+ floor(G/16) *16+B,运用Matlab编程计算彩色图像对于颜色编号的直方图,显示3-5幅彩色图像的 颜色直方图。
2.选择一幅图像,编程对颜色直方图的值按大小排序,取前n个(分别取1、2、5、8、16)值对应的颜色编号,作为图像的n个主色调,将颜色编号转换为RGB值显示出来;
3.根据颜色名——颜色值对照表,编程显示与n个主色调最接近颜色的颜色名;
4.用最接近的颜色主色调替代彩色图像的每个像素的颜色,编程实现,并显示用主色调逼近后的彩色图像,观察彩色图像颜色逼近的效果
clear;
sedu=[105 105 105
240 255 255
192 192 192
255 192 203
255 255 255
0 0 0
47 79 79
250 128 114
175 238 238
176 23 31
94 38 18
255 99 71
227 23 13
0 255 255
255 61 13
41 36 33
255 245 238
255 160 122
160 82 45
255 127 80
94 38 5
255 69 0
210 105 30
163 148 128
250 235 215
210 180 140
245 222 179
156 102 31
115 74 18
255 128 0
218 165 32
255 248 220
240 230 140
227 207 87
255 215 0
255 255 240
128 128 105
238 232 170
154 205 50
102 128 20
255 255 0
59 94 43
97 179 41
56 94 15
127 255 0
173 255 47
240 255 240
143 188 143
152 251 152
34 139 34
50 205 50
110 255 112
0 100 0
0 255 0
128 138 135
245 255 250
46 71 59
46 139 87
127 255 212
0 255 127
188 143 143
255 250 250
128 42 42
176 224 230
178 34 34
64 224 208
255 0 0
32 178 170
112 128 144
135 206 235
173 216 230
51 161 201
8 46 84
0 191 255
25 25 112
72 61 139
106 90 205
18 10 143
0 0 255
0 0 128
147 112 219
138 43 226
253 248 255
186 85 211
160 32 240
148 0 211
221 160 221
216 191 216
143 94 153
145 33 158
255 0 255
208 32 144
199 21 133
255 20 147
255 240 245
255 105 180
176 48 96];
A=double(imread('239.jpg'));
figure (1);
imshow(A/255);
[M,N,K]=size(A);
length=16*256;
hist(length)=0;
for i=1:M %计算彩色直方图
for j=1:N
m=floor(A(i,j,1)/16)*256+floor(A(i,j,2)/16)*16+floor(A(i,j,3)/16);
hist(m+1)=hist(m+1)+1;
end
end
figure (2);
plot(hist);
%对彩色直方图排序
paixu(length)=0;
paixu=hist;
for i=1:length
for j=1:length-i
if paixu(j)<paixu(j+1)
t=paixu(j+1);
paixu(j+1)=paixu(j);
paixu(j)=t;
end
end
end
figure (3)
plot(paixu);
%取出前n个主色调对应的下标值
histcopy=hist;
n=8;
color(n)=0;
for q=1:n
for i=1:length
if histcopy(i)==paixu(q)
histcopy(i)=0;
color(q)=i-1;
end
end
end
R(n)=0;
G(n)=0;
B(n)=0;
%取出主色调的红,绿,蓝值,并显示
for q=1:n
R(q)=floor(color(q)/256)*16;
G(q)=floor(mod(color(q),256)/16)*16;
B(q)=mod(mod(color(q),256),16)*16;
end
figure(4)
subplot(2,2,1)
bar(R);
subplot(2,2,2)
bar(G);
subplot(2,2,3)
bar(B);
%求出图形主色调相对应的色系
chazhi(97)=0;
jinsi(n)=0;
for q=1:n
for i=1:97
chazhi(i)=abs(sedu(i,1)-R(q))+abs(sedu(i,2)-G(q))+abs(sedu(i,3)-B(q));
end
for i=1:97
if chazhi(i)==min(chazhi)
jinsi(q)=i;
end
end
end
%显示主色调
zhucolor(100,n*100,3)=0;
for i=1:100
for k=1:n
for j=((k-1)*100+1):k*100
zhucolor(i,j,1)=R(k);
zhucolor(i,j,2)=G(k);
zhucolor(i,j,3)=B(k);
end
end
end
figure(5)
imshow(double(zhucolor)/255);
%用主色调逼近原图
bijin(M,N,3)=0;
dir(n)=0;
for i=1:M
for j=1:N
for q=1:n
dir(q)=abs(A(i,j,1)-R(q))+abs(A(i,j,2)-G(q))+abs(A(i,j,3)-B(q));
end
for q=1:n
if dir(q)==min(dir)
bijin(i,j,1)=R(q);
bijin(i,j,2)=G(q);
bijin(i,j,3)=B(q);
end
end
end
end
figure(6)
imshow(double(bijin)/255);
评论0