功能
- 根据两点进行直线插补
- 支持不在图像中的点的插补,即对输入的两个点进行拟合,拟合直线上的点如果在图像范围内,则修改图像对应的像素值
实现代码
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)