Bresenham 算法——matlab实现

功能

  • 根据两点进行直线插补
  • 支持不在图像中的点的插补,即对输入的两个点进行拟合,拟合直线上的点如果在图像范围内,则修改图像对应的像素值

实现代码

Bresenham 算法可以保证图像的连通度,其实现方法如下:

function [ img , runTime ] = MyBresenhamDrawLine( img , x1 , y1 , x2 , y2 , lColor )
% Bresenham直线画线算法,img的图像背景为黑色,img为输入的图像,
% (x1,y1)为第一个点的坐标,x1是矩阵的行的位置,而非屏幕坐标系的定义
% (x2,y2)为第二个点的坐标
% lColor : 插补的直线的颜色的灰度值,默认是1,即白色
% 如果没有指定具体的颜色,则直线在图中默认是白色
    if nargin < 6
        lColor = 1;
    end

    if ~ismatrix(img)
        error('------------can not deal with 3-dims data!!!--------');
    end

    tic

    [height, width] = size( img );
    if x1>0 && x1<=height && y1>0 && y1<=width
        img(x1,y1) = lColor;
    end
    if x2>0 && x2<=height && y2>0 && y2<=width
        img(x2,y2) = lColor;
    end


    k = (y1-y2)/(x1-x2);

    flag = 1;
    if abs(k) > 1
        [x1, y1] = SwapXY( y1, x1 );
        [x2, y2] = SwapXY( y2, x2 );
        k = 1/k;
        flag = 0;
    end

    if x1 > x2
        [x1, x2] = SwapXY(x2, x1);
        [y1, y2] = SwapXY(y2, y1);
    end

    deltaX = x2 - x1;
    deltaY = abs(y2 - y1);
    p = 2*deltaY - deltaX;

    minX = min(x1, x2);
    maxX = max(x1, x2);

    yk = y1;

    for ii = minX : maxX-1
        if p < 0
            p = p + 2 * deltaY;
        else
            if k > 0
                yk = yk + 1;
            else
                yk = yk - 1;
            end
            p = p + 2 * deltaY - 2 * deltaX;
        end
        if flag
            if ii+1>0 && ii+1<=height && yk>0 && yk<=width
                img(ii+1,yk) = lColor;
            end
        else
            if ii+1>0 && ii+1<width && yk>0 && yk<height
                img(yk,ii+1) = lColor;
            end
        end
    end

    runTime = toc;


end

function [y, x]=SwapXY(x1,y1)
    x=y1;
    y=x1;
end

结果图

img = zeros(500);
img=MyBresenhamDrawLine(img,200, 500,600,400);
imtool(img)

这里写图片描述

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

littletomatodonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值