先插一嘴相似图片搜索的原理
大概类似Open CV马赛克拼图
1、批量导入图片,对图像进行处理,调整大小(我采用30x30)
2、计算每张图的平均灰度,建立每张图的灰度索引并按灰度级等分为10层
3、对于要拼的图,进行直方图均衡化(避免利用的灰度层次太集中)。调整大小(100x100),遍历每一个像素块,并归类在图片集的同一类中随机选择一张图填上(避免同一区域附近灰度值类似导致填充相同的图片)
代码太冗长了…
导入图片,进行统计分层
picstr=dir('*.jpg');%导入当前目录的所有图片
[row,~]=size(picstr);
pic_data=cell(row,2);
for i=1:row
pic_data{i,1}=imread(picstr(i).name);
A=pic_data{i,1};
num=round(sum(A(:))/900);
pic_data{i,2}=num;
end
for i=1:row
cnt(i)= pic_data{i,2};%灰度级
end
cnt=sort(cnt);
a(1)=cnt(round(row/10));a(2)=cnt(round(row*2/10));a(3)=cnt(round(row*3/10));a(4)=cnt(round(row*4/10));
a(5)=cnt(round(row*5/10));a(6)=cnt(round(row*6/10));a(7)=cnt(round(row*7/10));a(8)=cnt(round(row*8/10));
a(9)=cnt(round(row*9/10));%按个数进行等分,找到边界(由于我用的人像,所有图片都偏黑,如果按灰度等分会导致个数很不均匀)
%%分为10层
pic_level1={};pic_level2={};pic_level3={};pic_level4={};pic_level5={};pic_level6={};pic_level7={};pic_level8={};pic_level9={};pic_level10={};
for i=1:row
if pic_data{i,2}<a(1)
pic_level1=[pic_level1,pic_data{i,1}];
elseif pic_data{i,2}<a(2)
pic_level2=[pic_level2,pic_data{i,1}];
elseif pic_data{i,2}<a(3)
pic_level3=[pic_level3,pic_data{i,1}];
elseif pic_data{i,2}<a(4)
pic_level4=[pic_level4,pic_data{i,1}];
elseif pic_data{i,2}<a(5)
pic_level5=[pic_level5,pic_data{i,1}];
elseif pic_data{i,2}<a(6)
pic_level6=[pic_level6,pic_data{i,1}];
elseif pic_data{i,2}<a(7)
pic_level7=[pic_level7,pic_data{i,1}];
elseif pic_data{i,2}<a(8)
pic_level8=[pic_level8,pic_data{i,1}];
elseif pic_data{i,2}<a(9)
pic_level9=[pic_level9,pic_data{i,1}];
else
pic_level10=[pic_level10,pic_data{i,1}];
end
end
对目标图像处理
I=rgb2gray(timg);%我的图片
I=histeq(I);
I=imresize(I,[100,100]);
J=uint8([3000,3000]);
a=1;b=1;
for i=1:100
for j=1:100
if I(i,j)<30%对目标图像也分为10层,找对应的小图去替代
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level1{m};
elseif I(i,j)<55
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level2{m};
elseif I(i,j)<80
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level3{m};
elseif I(i,j)<105
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level4{m};
elseif I(i,j)<130
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level5{m};
elseif I(i,j)<155
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level6{m};
elseif I(i,j)<180
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level7{m};
elseif I(i,j)<205
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level8{m};
elseif I(i,j)<225
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level9{m};
else
m = unidrnd(100);
J(a:a+29,b:b+29)=pic_level10{m};
end
b=b+30;
end
a=a+30;
b=1;
end
imshow(J)
楚门: