数字图像处理课程设计(基于matlab的Hough变换检测图像边缘提取,包含完整代码)

基于matlab的图像Hough边缘提取

一、课程设计要求

  “0-4房屋图像1.jpg”和“0-5房屋图像2.jpg”是房屋立面的图像。请利用Hough变换检测,计算获得矢量化的房屋边缘特征。

二、设计思路

  首先先将彩色图片进行灰度处理,然后通过边缘检测算子,如Roberts算子,Prewitt算子,LoG算子……对目标图像边缘进行检测。
  其次,用均值滤波或者中值滤波对边缘检测后的图像进行去噪处理,去掉图像上的一些影响图像边缘提取的噪点。(这里有个小问题,最好先对原图像进行滤波处理再将处理过的图像进行边缘检测,因为没时间了就不做修改了,还有算子的话最好自己再加个canny算子提取效果会更好
  接着,将图像进行二值化处理,转化为黑白图片
  最后,通过Hough变换检测,将边缘描绘出来得出最终的提取效果。

三、总体设计

  使用matlab app进行图形界面化设计,要求能够从文件夹中读取文件并在界面上展示,设计多种边缘检测算子与滤波处理和二值化处理,能够在界面上显示处理效果。并能将最后的效果保存到指定的文件夹中。

四、代码实现

1.文件的打开与读取

打开文件夹,将内容显示在UIAxes的框框内

function ButtonPushed(app, event)
[filename,filepath]=uigetfile({'*.jpg','*.png'},'选择图片');
if isequal(filename,0)||isequal(filepath,0)
errordlg('没有选中的文件','错误');
else
file=strcat(filepath,filename);
end
im=imread(file);
app.originimg = im; 
app.gim=rgb2gray(im);
app.gim = im2double(app.gim);
imshow(im,'Parent',app.UIAxes);
end

2.边缘检测算子的实现

①LoG算子

function log = log_margin(app,img)
[m,n]=size(img);
log=zeros(m,n);
for i=3:m-2
for j=3:n-2
log(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 
end

②Prewitt算子

function pre = prewitt_margin(app,f)
[m,n]=size(f);
pre=zeros(m,n);
for i=2:m-1
for j=2:n-1
pre(i,j)=abs(f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)-f(i-1,j+1)-f(i,j+1)-f(i+1,j+1))+abs(f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)-f(i-1,j-1)-f(i-1,j)-f(i-1,j+1));
end
end
end

③Sobel算子

function sob = sobel_margin(app,image)
[m,n]=size(image);
sob=zeros(m,n);
for i=2:m-1
for j=2:n-1
sob(i,j)=abs(image(i-1,j-1)+2*image(i,j-1)+image(i+1,j-1)-image(i-1,j+1)-2*image(i,j+1)-image(i+1,j+1))+abs(image(i+1,j-1)+2*image(i+1,j)+image(i+1,j+1)-image(i-1,j-1)-2*image(i-1,j)-image(i-1,j+1));
end
end
end

④Roberts算子

function rob = roberts_margin(app,image)
[m,n]=size(image);
rob=zeros(m,n);
for i=2:m-1
for j=2:n-1
rob(i,j)=abs(image(i+1,j+1)-image(i,j))+abs(image(i,j+1)-image(i+1,j));
end
end
end

3.滤波处理算法

①均值滤波

function [smooth] = average_filter(app,image)
[m,n]=size(image);
smooth=zeros(m,n);
for i=2:m-1
for j=2:n-1
smooth(i,j) = image(i-1,j-1)+image(i-1,j)+image(i-1,j+1)+image(i,j-1)+image(i,j)+image(i,j+1)+image(i+1,j-1)+image(i+1,j)+image(i+1,j+1);
smooth(i,j) = smooth(i,j)/9;
end
end
end

②中值滤波

function [ x2 ] = median_filter(app,image, m )
n = m;
[ height, width ] = size(image);
x1 = double(image);
x2 = x1;
for i = 1: height-n+1
for j = 1:width-n+1
mb = x1( i:(i+n-1), j:(j+n-1) );
mb = mb(:);
mm = median(mb);
x2( i+(n-1)/2, j+(n-1)/2 ) = mm; 
end
end
end

4.图像二值化处理

function [binary_img] = binary(app,image,T)
binary_img = im2uint8(image);% 将均值滤波后的图像转换为uint8类型图像,即图像色彩范围[0,255]
[m,n]=size(binary_img);
for i=1:m
for j=1:n
if binary_img(i,j)>T % 设置二值化的阈值
binary_img(i,j) = 255;% 超过阈值的设为白点
else
binary_img(i,j) = 0;%小于阈值的设为黑点
end
end
end
end

5.Hough变换检测

function [origin_img] = hough_tram(app,binary_img,origin_img,T)
angle = 180;
[m,n]=size(binary_img);
distance = round(sqrt(m^2+n^2));
number_ap = zeros(angle,2*distance);
coordinate = cell(angle,2*distance);
for i = 1:m
for j = 1:n
if(binary_img(i,j) == 255)
for k = 1:angle
p = round(i*cos(pi*k/180)+j*sin(pi*k/180));
if(p > 0)
number_ap(k,distance+p) = number_ap(k,distance+p)+1;
coordinate{k,distance+p} = [coordinate{k,distance+p},[i,j]];
else
ap = abs(p)+1; 
number_ap(k,ap) = number_ap(k,ap)+1;
coordinate{k,ap} = [coordinate{k,ap},[i,j]];
end
end
end
end
end
for i = 1:angle
for j = 1:distance*2
if(number_ap(i,j)>T)%提取直线的阈值
point = coordinate{i,j};%提取对应点坐标
[m,n] = size(point);
for k = 1:number_ap(i,j)
origin_img(point(2*k-1),point(2*k),1) = 0;
origin_img(point(2*k-1),point(2*k),2) = 255;
origin_img(point(2*k-1),point(2*k),3) = 0;
end
end
end
end
end

6.文件的保存

function reserve(app,image,sz)
path = 'F:/matlab/work/hough transform/';
prefix = 'hough_';
format = 'jpg';
suffix = strcat('.',format);
imwrite(image,strcat(path,prefix,num2str(sz),suffix));
msgbox('图像保存成功');
end

五、运行结果展示

1.主界面

在这里插入图片描述

2.边缘检测

在这里插入图片描述

3.噪声处理

在这里插入图片描述

4.二值化处理

在这里插入图片描述

5.边缘提取

在这里插入图片描述

6.效果对比

原图:(边缘不平整)
在这里插入图片描述
处理图:
在这里插入图片描述
原图:(边缘平整)
在这里插入图片描述
处理图:
在这里插入图片描述

六、分析与总结

  图像的Hough变换是一种图像特征提取的技术,通过投票法检测特定形状并提取,其方法是在参数空间中通过投票累加获得局部最大值,从而通过值得到符合特定形状的集合,该集合即为Hough变换结果。
  在Hough变换中,主要是利用图像的特殊形状,按照指定的函数进行参数空间点的累加,每取到函数形状上的点则进行投票累加,最后通过参数限制获得需要统计的点并组成点的集合,此时即可得到最终的边界点。Hough变换多用于对直线、圆、椭圆形状的检测和提取。Hough变换算法适用于所有能够用方程表达出的图像特征,而其算法的复杂度也随着图像特征方程的复杂度变化。
  根据检测结果可以总结出以下几点。
  (一)Hough变换是通过函数拟合来完成边缘选择的,对于具有单一颜色、简单边缘以及已知函数的图像而言,Hough变换能够更好地选择边缘,例如上图的小车;
  (二)Hough变换不适合用于复杂颜色、复杂边缘的图像,例如上图的房屋,这种图像都不适合进行函数拟合,Hough变换会使得最终的效果较差。

参考文献:
【1】CSDN博客 无限遐想计划 https://blog.csdn.net/qq_43571150/article/details/103544472
【2】数字图像处理(MATLAB版))第二版 冈萨雷斯

  • 16
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打代码能当饭吃?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值