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

news/2025/1/15 18:03:37/

基于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版))第二版 冈萨雷斯


http://www.ppmy.cn/news/531937.html

相关文章

图像去雾算法学习

现有的图像采集设备对外界环境的干扰非常敏感,在雾霾环境中,获取的户外图像往往退化严重,主要表现为场景特征信息模糊、对比度低、色彩失真,不利于计算机视觉系统对图像真实特征的提取,从而影响其后续的分析、理解、识别等一系列处理,很大程度上降低了视觉系统的实际应用…

图像处理(1)--数字图像及彩色空间

文章结构 1. 数字图像2. 彩色空间2.1 RGB2.2 CMY和CMYK2.3 HSI2.4 YIQ2.5 YUV2.6 YCbCr 3. 伪彩色图像处理4. 全彩色图像处理5. 彩色变换6. 彩色图像平滑和尖锐化 图像处理系列笔记: https://blog.csdn.net/qq_33208851/article/details/95335809 像素:…

快速入门学习数字图像处理(冈萨雷斯第三版)

一、绪论以及储备知识 1、数字图像处理 何谓数字图像处理?数字图像处理就是指借助于数字计算机来处理图像。因为计算机只能处理离散的数字量,所以一幅要被计算机处理的图像也必须是离散的。这幅图像有很多个元素组成,这些元素就是我们通常所…

计算机视觉基础之数字图像(1)

目录 一、 图像(各种图形和影像的总称)1、像素、分辨率2、灰度、通道、对比度3、RGB模型3、为什么很多图像识别将彩色图像灰度化? 二、 图像的取样与量化三、上采样与下采样1、上、下采样2、常用的插值算法 一、 图像(各种图形和影像的总称) 图像是人类视觉的基础&a…

《数字图像处理》- 1. MATLAB实现图像的傅里叶变换

声明 本文仅在CSDN发布,其他均为盗版。请支持正版! 正版链接:https://blog.csdn.net/meenr/article/details/117605843 用MATLAB实现图像的傅里叶变换 实验1、MATLAB实现图像的傅里叶变换 目录 实验1、MATLAB实现图像的傅里叶变换1. 实验目…

【计算机视觉】数字图像与机器视觉基础

目录 一、位图文件分析1. 什么是位图2. BMP位图文件3. BMP文件结构4. 位图文件头5. 位深度6. 不同位深度图像对比 二、对比不同文件格式的图片文件大小三、基于奇异值分解(SVD)提取图片特征值四、开闭运算检测图像中硬币和细胞的个数1. 检测硬币数量2. 检测细胞数量 五、图片条…

【CV/Matlab系列】基于matlab GUI的数字图像处理系统设计【含Matlab源码】

DATE: 2020.10.18 文章目录 0、代码获取方式1、前言2、数字图像处理平台展示2.1、初始界面2.2、示例1(FFT)2.3、示例2(平滑滤波)2.4、示例3(锐化)2.5、示例4(Sobel边缘检测)2.6、示例5(图像复原)0、代码获取方式 方式一:订阅付费专栏 《毕业设计代码进阶版》,可获…

C语言数字图像处理---1.1图像的像素格式与图像读写

前言 本专栏面向所有希望或有兴趣从事数字图像处理工作、学习或研究的朋友,不懂MATLAB和OPENCV没关系,仅需要基础的C语言知识,便可以通过本专栏内容轻松入门数字图像处理方向。目前市面上的数字图像处理书籍种类繁多,往往令人眼花…