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
原文地址:https://www.cnblogs.com/tiandsp/p/3959633.html