糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 数字图像处理|Matlab-图像分割与边缘检测实验-Hough线检测

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

时间:2023-04-25 09:53:09

相关推荐

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

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

代码链接:/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,列nfor i=3:m-2for 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);endend% 均值滤波处理[m,n]=size(log_margin);for i=2:m-1for 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;endend% 二值化处理binary_img = im2uint8(smooth); % 将均值滤波后的图像转换为uint8类型图像,即图像色彩范围[0,255][m,n]=size(binary_img);for i=1:mfor j=1:nif binary_img(i,j)>50 % 设置二值化的阈值为80binary_img(i,j) = 255; % 超过阈值的设为白点elsebinary_img(i,j) = 0; %小于阈值的设为黑点endendend% 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:mfor 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)数量加1coordinate{k,distance+p} = [coordinate{k,distance+p},[i,j]];% 在点集合中存储该点坐标(i,j)elseap = abs(p)+1;% 若p小于0,则将点存储在坐标集合(0,distance)空间,该集合点的极坐标θ∈[90,180]number_ap(k,ap) = number_ap(k,ap)+1;% 符合直线的点(a,p)数量加1coordinate{k,ap} = [coordinate{k,ap},[i,j]];% 在点集合中存储该点坐标(i,j)endendendendend% 绘制图像边缘for i = 1:anglefor j = 1:distance*2 % 遍历累加器number_ap和点坐标coordinateif(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分量=0origin_img(point(2*k-1),point(2*k),2) = 0;origin_img(point(2*k-1),point(2*k),3) = 0;% 为满足阈值要求的直线上的点赋红色endendendendsubplot(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');

如果觉得《数字图像处理|Matlab-图像分割与边缘检测实验-Hough线检测》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。