• 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
  • 相关阅读:
    网络编程笔记--socket可读可写条件
    redis内核了解
    TIPI 阅读笔记 ----cgi 和 fastcgi
    csv 导 mysql
    Linux IO模式及 select、poll、epoll详解(转载)
    nginx 配置location php 不被解析解决办法
    汇编实验九
    汇编实验四
    实验三
    汇编 实验二
  • 原文地址:https://www.cnblogs.com/tiandsp/p/3959633.html
Copyright © 2020-2023  润新知