matlab练习程序(随机直线采样)

我只是感觉好玩,写了这样一段程序。

原理就是先随机生成两个点,然后根据这两个点画直线,最后在直线上的像素保留,没在直线上的像素丢弃就行了。

最后生成了一幅含有很多空洞的图像。

当然,对含有空洞的图像是可以用修复算法修复的。

我也尝试修复了一下,用的算法我过去也写过,可以看这里

这一次就不贴修复代码了,那段程序中的输入图像img、mask和这里的输出图像img、mask是一模一样的。

原图:

采样后:

修复后:

matlab代码如下:

main.m:

clear all; close all;clc;

img=double(imread('lena.jpg'));
imshow(img,[]);

[h,w]=size(img);

n=200;
pix=rand(n,4);
pix(:,1:2)=round(pix(:,1:2)*(w-1))+1;
pix(:,3:4)=round(pix(:,3:4)*(h-1))+1;
mask=zeros(h,w);

for i=1:n
    x1=pix(i,1);x2=pix(i,2);   
    y1=pix(i,3);y2=pix(i,4);   
    mask=drawline(mask,x1,y1,x2,y2); 
end

ind=find(mask~=1);
img(ind)=0;
figure;imshow(img,[])

drawline.m:

function img=drawline(img,x1,y1,x2,y2)   %因为图像坐标和数学函数坐标y轴朝向相反,所以这里所有y变量取相反数
    [h w]=size(img);
    y1=-y1;
    y2=-y2;
    
    if x1~=x2
        k=(y2-y1)/(x2-x1);
        b=y1-k*x1;      
        for i=1:w
            yy=-round(i*k+b);
            xx=i;
            if yy>=1 && yy<=h && xx>=1 && xx<=w
                img(yy,xx)=1; 
            end
        end
    end
    
    if y1~=y2
        k=(x2-x1)/(y2-y1);
        b=x1-k*y1;         
        for i=-h:1
            yy=-i;
            xx=round(i*k+b);
            if yy>=1 && yy<=h && xx>=1 && xx<=w
                img(yy,xx)=1; 
            end
        end        
    end
 
end

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值