数字图像处理|Matlab-图像分割与边缘检测实验-Hough线检测

Matlab-图像分割与边缘检测实验-Hough线检测

代码链接: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)空间,该集合点的极坐标θ∈[90180]
					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');

你可能感兴趣的:(数字图像处理,边缘检测)