我只是感覺好玩,寫了這樣一段程序。
原理就是先隨機生成兩個點,然后根據這兩個點畫直線,最后在直線上的像素保留,沒在直線上的像素丟棄就行了。
最后生成了一幅含有很多空洞的圖像。
當然,對含有空洞的圖像是可以用修復算法修復的。
我也嘗試修復了一下,用的算法我過去也寫過,可以看這里。
這一次就不貼修復代碼了,那段程序中的輸入圖像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