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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM