如何利用MATLAB实现,求大神指导
进一步,在图片中取随机圆(圆心、半径都随机),在圆上的像素点保留,其他的丢弃,当随机圆的数目达到一定数目时,图像该是什么样子。请编程实现。
注意:1.随机点的生成方法 2.图片的坐标构造方法 3.图片中的点是离散的 展开
主函数:
clear all;
close all;
clc;
a=imread('tttt.jpg');
imshow(a)
number=400;
p='c';
r=10;
if p=='line'
num=number*2;
xx=floor(rand(1,num)*size(a,1))+1;
yy=floor(rand(1,num)*size(a,2))+1;
pt=[xx;yy];
pt(find(pt(:)==256))=255;
ap=a;
ap(:)=0;
for i=1:size(pt,2)/2
ppt=pt(:, i*2-1:i*2)
t=linen(ppt);
for j=1:size(t,2)
wei=uint8(t(:,j));
ap(wei(1),wei(2))= a(wei(1),wei(2));
end
end
else
xx=floor(rand(1,number)*size(a,1))+1;
yy=floor(rand(1,number)*size(a,2))+1;
pt=[xx;yy];
pt(find(pt(:)==256))=255;
r=floor(rand(1,number)*r)+1;
yuan=[pt;r];
ap = n_line( yuan,a );
end
figure;
imshow(ap)
子函数1:
function [ t ] = linen( ppt )
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
p1=ppt(:,1);
p2=ppt(:,2);
if(p1(1)-p2(1))==0
tp=min ([p1(2) p2(2)]):1:max ([p1(2) p2(2)]);
t=zeros(2,length(tp));
t(1,:)=p1(1);
t(2,:)=tp;
elseif (p1(2)-p2(2))==0
tp=min ([p1(1) p2(1)]):1:max ([p1(1) p2(1)]);
t=zeros(2,length(tp));
t(2,:)=p1(2);
t(1,:)=tp;
else
k = (p1(2)-p2(2))/(p1(1)-p2(1));
b = p1(2) - k*p1(1);
for i=min ([p1(1) p2(1)]):1:max ([p1(1) p2(1)]);
t(2,i-min ([p1(1) p2(1)])+1)=k*i+b;
t(1,i-min ([p1(1) p2(1)])+1)=i;
end
end
end
子函数2 :
function [ t ] = n_line( yuan,a )
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here
t=a;
t(:)=0;
[m,n ]=size(a);
for i=1:m
for j=1:n
for p=1:size(yuan,2)
cent=yuan(1:2,p);
rid=yuan(3,p);
dis=sqrt((i-cent(1))^2+(j-cent(2))^2);
if dis<rid
t(i,j)=a(i,j);
end
end
end
end
end
比较乱, 你自己看下的吧 应该修改下会精炼很多 思想大概是这样的 输入图片的画 只能为单通道 3通道的话 还得稍微改下
p为类型选择 p='line'则用线条覆盖, 其他情况则选择圆形
number为mask个数, 即多少个圆 或者多少条直线
r为圆模式下的 半径范围 当r=30 则对应生成的随即半径范围为1——30
画线
I=imread('cameraman.tif');
[m n]=size(I);
N=100;%直线数
mask=zeros(m,n,'uint8');%全0模板
for k=1:N
TF=1;
while(TF);
i=randi(m,1,2);%随机两个行坐标
j=randi(n,1,2);%随机两个列坐标
TF=(i(1)==i(2)&&j(1)==j(2));%如果两点相同重新随机
end
di=i(1)-i(2);
dj=j(1)-j(2);
%变化较大的坐标取连续整数,变化较小的坐标通过计算取整
if abs(di)>=abs(dj)
ii=1:m;
jj=round(dj/di*(ii-i(1))+j(1));
temp=(jj>=1&jj<=n);
else
jj=1:n;
ii=round(di/dj*(jj-j(1))+i(1));
temp=(ii>=1&ii<=m);
end
ii=ii(temp);jj=jj(temp); %剔出超出图像范围的点
mask(sub2ind([m n],ii,jj))=1; %将模板对应位置置1
end
I1=I.*mask;%原图与模板相乘得到结果
subplot(121),imshow(I);
subplot(122),imshow(I1);
画圆
I=imread('cameraman.tif');
[m n]=size(I);
N=200;%圆数
rmax=10;%最大半径
rmin=5;%最小半径
mask=zeros(m,n,'uint8');%全0模板
for k=1:N
r=rand()*(rmax-rmin)+rmin;%随机一个半径
i=rand()*(m+2*r)-r;%随机圆心行坐标
j=rand()*(n+2*r)-r;%随机圆心列坐标
[ii jj]=meshgrid(floor(i-r):ceil(i+r),floor(j-r):ceil(j+r));
temp=((ii-i).^2+(jj-j).^2)<=r^2;
ii=ii(temp);jj=jj(temp);%剔出圆外的点
temp=(ii>=1&ii<=m&jj>=1&jj<=n);
ii=ii(temp);jj=jj(temp); %剔出超出图像范围的点
mask(sub2ind([m n],ii,jj))=1; %将模板对应位置置1
end
I1=I.*mask;%原图与模板相乘得到结果
subplot(121),imshow(I);
subplot(122),imshow(I1);