如何利用MATLAB实现,求大神指导

右图是由左图(0-255)生成的,生成方法是随机取两点,过两点画一条直线,在直线上的左图的像素点保留,其他点丢弃(可置零);当直线取若干条时,右图生成。请尝试实现。图片可... 右图是由左图(0-255)生成的,生成方法是随机取两点,过两点画一条直线,在直线上的左图的像素点保留,其他点丢弃(可置零);当直线取若干条时,右图生成。请尝试实现。图片可以使用任意图片实现。

进一步,在图片中取随机圆(圆心、半径都随机),在圆上的像素点保留,其他的丢弃,当随机圆的数目达到一定数目时,图像该是什么样子。请编程实现。

注意:1.随机点的生成方法 2.图片的坐标构造方法 3.图片中的点是离散的
展开
 我来答
lliang77
2014-11-19 · TA获得超过104个赞
知道答主
回答量:189
采纳率:0%
帮助的人:136万
展开全部

 

主函数:

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

dukinkin
2014-11-19 · TA获得超过1.3万个赞
知道大有可为答主
回答量:2444
采纳率:90%
帮助的人:946万
展开全部

画线

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);

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式