标签:style blog http color os io ar for 2014
我只是感觉好玩,写了这样一段程序。
原理就是先随机生成两个点,然后根据这两个点画直线,最后在直线上的像素保留,没在直线上的像素丢弃就行了。
最后生成了一幅含有很多空洞的图像。
当然,对含有空洞的图像是可以用修复算法修复的。
我也尝试修复了一下,用的算法我过去也写过,可以看这里。
这一次就不贴修复代码了,那段程序中的输入图像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
标签:style blog http color os io ar for 2014
原文地址:http://www.cnblogs.com/tiandsp/p/3959633.html