代码链接:https://download.csdn.net/download/qq_43571150/12033268
问题1:对作业一中边缘检测的结果,进行Hough线检测。
问题2:调节参数,提取较长的边界。
图像结果
Matlab代码
clear all;
I = imread('05.jpg'); %读入彩色图像
origin_img = I; %复制彩色原图以最后对边缘上色
img = rgb2gray(I); %将图像转换成为灰度图
img = im2double(img); %将图像转换成为double类型
[m,n]=size(img); % 得到图像大小行m,列n
for i=3:m-2
for j=3:n-2 % 计算区域从图像(3,3)开始,到(m-2,n-2)结束
% LoG算子粗提取图像边缘
log_margin(i,j) = -img(i-2,j)-img(i-1,j-1)-2*img(i-1,j)-img(i-1,j+1)-img(i,j+2)-2*img(i,j-1)+16*img(i,j)-2*img(i,j+1)-img(i,j+2)-img(i+1,j-1)-2*img(i+1,j)-img(i+1,j+1)-img(i+2,j);
end
end
% 均值滤波处理
[m,n]=size(log_margin);
for i=2:m-1
for j=2:n-1
% LoG算子粗提取边缘后,进行均值滤波去除噪声(3x3范围)
smooth(i,j) = log_margin(i-1,j-1)+log_margin(i-1,j)+log_margin(i-1,j+1)+log_margin(i,j-1)+log_margin(i,j)+log_margin(i,j+1)+log_margin(i+1,j-1)+log_margin(i+1,j)+log_margin(i+1,j+1);
smooth(i,j) = smooth(i,j)/9;
end
end
% 二值化处理
binary_img = im2uint8(smooth); % 将均值滤波后的图像转换为uint8类型图像,即图像色彩范围[0,255]
[m,n]=size(binary_img);
for i=1:m
for j=1:n
if binary_img(i,j)>50 % 设置二值化的阈值为80
binary_img(i,j) = 255; % 超过阈值的设为白点
else
binary_img(i,j) = 0; %小于阈值的设为黑点
end
end
end
% Hough变换检测,使用(a,p)参数空间(极坐标),a∈[0,180],p∈[0,2d]
angle = 180; % 极坐标角度的值为0~180度
distance = round(sqrt(m^2+n^2)); % 图像对角线长度最大值distance,从而确定p的取值范围为[-distance,distance]
number_ap = zeros(angle,2*distance); % 存储每个检测点(a,p)的个数
coordinate = cell(angle,2*distance); % 用元胞数组存储每个检测点的坐标(i,j)
% 投票法检测边缘白点
for i = 1:m
for j = 1:n % 遍历二值化图像的每个点
if(binary_img(i,j) == 255) % 仅对于每一个白点边缘点进行检测
for k = 1:angle
% 对每个点从1~180度遍历,取得经过该点的所有直线的p值(产生选民)
p = round(i*cos(pi*k/180)+j*sin(pi*k/180));
% 若p大于0,则将点存储在坐标集合(distance,2*distance)空间(投票存储器),该集合点的极坐标θ∈[0,90]
if(p > 0)
number_ap(k,distance+p) = number_ap(k,distance+p)+1; % 符合直线的点(a,p)数量加1
coordinate{k,distance+p} = [coordinate{k,distance+p},[i,j]]; % 在点集合中存储该点坐标(i,j)
else
ap = abs(p)+1; % 若p小于0,则将点存储在坐标集合(0,distance)空间,该集合点的极坐标θ∈[90,180]
number_ap(k,ap) = number_ap(k,ap)+1; % 符合直线的点(a,p)数量加1
coordinate{k,ap} = [coordinate{k,ap},[i,j]]; % 在点集合中存储该点坐标(i,j)
end
end
end
end
end
% 绘制图像边缘
for i = 1:angle
for j = 1:distance*2 % 遍历累加器number_ap和点坐标coordinate
if(number_ap(i,j)>30) % 提取直线的阈值
point = coordinate{i,j}; %提取对应点坐标
[m,n] = size(point);
%对满足阈值条件的累加器单元中(a,p)对应的所有点进行操作
for k = 1:number_ap(i,j)
origin_img(point(2*k-1),point(2*k),1) = 255; % 每个点R分量=255,G分量=0,B分量=0
origin_img(point(2*k-1),point(2*k),2) = 0;
origin_img(point(2*k-1),point(2*k),3) = 0; % 为满足阈值要求的直线上的点赋红色
end
end
end
end
subplot(2,3,1);imshow(I);title('input');
subplot(2,3,2);imshow(log_margin);title('提取图像边缘');
subplot(2,3,3);imshow(smooth);title('均值滤波处理后');
subplot(2,3,4);imshow(binary_img);title('二值化处理后');
subplot(2,3,5);imshow(origin_img);title('Hough变换后在原图上绘制边界');
imwrite(origin_img,'05 Hough变换 边界30.jpg');