原图git
效果图ide
files = dir(fullfile('D:\document\GitHub\homework\digital image processing\image_spider\animation\','*.jpg')); target=imread('D:\document\GitHub\homework\digital image processing\image_spider\target.jpg'); lengthFiles = length(files); error=0; data=[]; for i = 1:lengthFiles; try Img = imread(strcat('D:\document\GitHub\homework\digital image processing\image_spider\animation\',files(i).name));%文件所在路径 %改变大小 newimg=imresize(Img,[10,10]); %获取三份量 imager=newimg(:,:,1); imageg=newimg(:,:,2); imageb=newimg(:,:,3); %统计平均值 image_r=0; image_g=0; image_b=0; for m=1:10 for j=1:10 image_r=int32(image_r)+int32(imager(m,j)); image_g=int32(image_g)+int32(imager(m,j)); image_b=int32(image_b)+int32(imager(m,j)); %fprintf('i is %d image_r is %d image_g is %d image_b is %d\n',i,image_r,image_g,image_b) end end fprintf('i is %d image_r is %d image_g is %d image_b is %d\n',i,image_r,image_g,image_b) image_r=image_r/100; image_g=image_g/100; image_b=image_b/100; data=[data image_r image_g image_b]; %disp(strcat('D:\document\GitHub\homework\digital image processing\image_spider\animation\',files(i).name)) %打印文件路径 %imshow(Img) catch disp(strcat('D:\document\GitHub\homework\digital image processing\image_spider\animation\',files(i).name)) %打印文件路径 error=error+1; end end sizetarget=size(target); x=sizetarget(1,1); y=sizetarget(1,2); t_image_r=0; t_image_g=0; t_image_b=0; for i=1:10:x for j=1:10:y if (i+9>x||j+9>y) continue; end for m=i:i+9 for n=j:j+9 t_image_r=int32(t_image_r)+int32(target(m,n,1)); t_image_g=int32(t_image_g)+int32(target(m,n,2)); t_image_b=int32(t_image_b)+int32(target(m,n,3)); end end t_image_r=t_image_r/100; t_image_g=t_image_g/100; t_image_b=t_image_b/100; %fprintf('r is %d g is %d b is %d\n',t_image_r,t_image_g,t_image_b) cha=765; mini=1; sizedata=size(data); for q=1:3:sizedata(1,2) cha1=abs(t_image_r-data(q))+abs(t_image_g-data(q+1))+abs(t_image_b-data(q+2)); if(cha1<cha) cha=cha1; mini=floor(q/3)+1; end end %disp(mini) Img = imread(strcat('D:\document\GitHub\homework\digital image processing\image_spider\animation\',files(mini).name));%文件所在路径 newimg=imresize(Img,[10,10]); for q=0:9 for p=0:9 target(i+q,j+p,1)=newimg(q+1,p+1,1); target(i+q,j+p,2)=newimg(q+1,p+1,2); target(i+q,j+p,3)=newimg(q+1,p+1,3); end end fprintf('x is %d y is %d\n',i,j) end end imwrite(target,'target.jpg');
第二部分思路很简单,其实就是某块像素区域rgb份量相近的图片去替换原图片中对应像素点便可。在上述代码中,我选择将其余图片先转化为1010大小的图片,分别计算rgb三个分类的平均值,以后,用10 10大小的核扫描原图像,计算该块内rgb份量平均值,随后计算|r-t_r|+|g-t_g|+|b-t_b|之和,统计最小的数值,选取对应的图片像素替换原位置像素值。3d
从效果图中咱们能够发现,其实有不少地方的颜色并非很匹配,这个缘由有两个,其中一个是备选图像库比较少,颜色单调,个人图像备选库大小是八百,从网上爬取的一个类型图片,因此可能颜色大致都是那么几种。第二个缘由就是核大小的选择,选择小一点,就能显示得更像一个图像。其次,这份代码其实有点过于暴力,彻底匹配每张图片耗时有点多,尤为是在备选图库很是大的时候,以后有时间再作修改~也欢迎补充建议code