demo:matlab灰度蒙太奇马赛克拼图(残次品)

先插一嘴相似图片搜索的原理

大概类似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)

楚门:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值