功能
- 根据中点圆算法对图像进行圆形插补
- 只插补在图像像素范围内的点,对于计算出来的不在图像像素范围内的点,不在图像上加以显示
代码
function [img , runTime] = CenterDrawCircle( img, xc, yc, r, lColor )
%[outmg , runTime] = DrawCircle( img, x0, y0, r ) 根据中点圆算法在输入的背景图上画圆
% img : 输入的图像
% x0,y0 : 圆心的坐标,x0是圆心的横坐标的位置,y0是圆心的纵坐标的位置
% r : 圆的半径
% lColor : 插补的圆的像素值,默认是是1
% example :
% img = zeros(500);
% xc = 100;
% yc = 200;
% r = 44;
% img = CenterDrawCircle(img, xc, yc, r);
% imshow(img)
%
%
if nargin < 5
lColor = 1;
end
if ~ismatrix(img)
error('-------can not deal with this image-------');
end
x0 = 0;
y0 = r;
img = DrawEightPoints(img, xc, yc, x0, y0, lColor);
pk = 1.25 - r;
while x0 <= y0
x0 = x0 + 1;
if pk < 0
pk = pk + 2*x0 + 1;
else
y0 = y0 - 1;
pk = pk + 2*x0 + 1 - 2*y0;
end
img = DrawEightPoints(img, xc, yc, x0, y0, lColor);
end
end
% 根据对称性,已知一个点,画8个点
function img = DrawEightPoints(img, xc, yc, x, y, lColor)
if IsInImage(img, xc+x, yc+y)
img(xc+x, yc+y) = lColor;
end
if IsInImage(img, xc+y, yc+x)
img(xc+y, yc+x) = lColor;
end
if IsInImage(img, xc+y, yc-x)
img(xc+y, yc-x) = lColor;
end
if IsInImage(img, xc+x, yc-y)
img(xc+x, yc-y) = lColor;
end
if IsInImage(img, xc-x, yc-y)
img(xc-x, yc-y) = lColor;
end
if IsInImage(img, xc-x, yc+y)
img(xc-x, yc+y) = lColor;
end
if IsInImage(img, xc-y, yc-x)
img(xc-y, yc-x) = lColor;
end
if IsInImage(img, xc-y, yc+x)
img(xc-y, yc+x) = lColor;
end
end
% 判断(x,y)是否在图像的像素坐标范围内,若在,则返回true
function res = IsInImage( img, x, y )
res = false;
if x>0 && x<=size(img, 1) && y>0 && y<=size(img, 2)
res = true;
end
end
图片
img = zeros(500);
xc = 100;
yc = 200;
r = 44;
img = CenterDrawCircle(img, xc, yc, r);
imshow(img)
半径为44:
半径为300: