本文主要是介绍数字图像处理课程设计Hough变换检测房屋车道等边缘特征,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
摘要
霍夫变换是一个特征提取技术。其可用于隔离图像中特定形状的特征的技术,应用在图像分析、计算机视觉和数字图像处理领域。目的是通过投票程序在特定类型的形状内找到对象的不完美实例。这个投票程序是在一个参数空间中进行的,在这个参数空间中,候选对象被当作所谓的累加器空间中的局部最大值来获得,所述累加器空间由用于计算霍夫变换的算法明确地构建。最基本的霍夫变换是从黑白图像中检测直线(线段)。Hough变换主要优点是能容忍特征边界描述中的间隙,并且相对不受图像噪声的影响。因此本实验我将利用Hough变换检测,计算获得矢量化的房屋边缘特征。
总体设计
本实验通过图形界面的方式展示了Hough变换的应用,界面友好,方便使用。其中界面上分别设有五个按钮,以便提供用户交互体验。五个按钮分别是读取图像按钮,Prewitt边缘检测按钮,Hough变换按钮,Hough变换检测特征按钮以及退出按钮。用户通过分别点击各个按钮完成整个流程,极大的方便了用户的使用。其次每点击一个按钮就会显示相应功能处理后的图像,给了用户很好的使用体验感。其主要总结起来就是读入图片,对其进行灰度变换,然后高斯滤波平滑处理,对其进行Hough变换,最后进行Hough变换直线检测。
技术原理
霍夫变换最简单的是检测直线。我们知道,直线的方程表示可以由斜率和截距表示(这种表示方法,称为斜截式),如下所示:
y = k x + b y = kx+b y=kx+b
如果用参数空间表示则为(b,k),即用斜率和截距就能表示一条直线。对于任意两点的直线方程:y = Kx + b,构造一个参数K,b的平面。
1、xy平面上的任意一条直线y = ax + b ,对应在参数ab平面上是一个点;
2、过xy平面一个点(x,y)的所有直线,构成参数ab平面上的一条直线。
但是这样会参数问题,垂直线的斜率不存在,这使得斜率参数K的值接近于无限。为此,为了更好的计算,1971年4月,提出了Hesse normal form(Hesse法线式)。
r = x c o s θ + y s i n θ r=xcosθ+ysinθ r=xcosθ+ysinθ
其中r是原点到直线上最近点的距离(其他人可能把这记录为ρ,下面也可以把r看成参数ρ),θ是x轴与连接原点和最近点直线之间的夹角。如下图所示。
因此,可以将图像的每一条直线与一对参数(r,θ)相关联。这个参数(r,θ)平面有时被称为霍夫空间,用于二维直线的集合。
Hough变换线检测的流程
首先适当地离散化参数空间。然后为参数空间的每一个单元设置一个累加器,把累加器初始化为零。其次对图像空间的每一点,在其所满足的参数方 程对应的累加器上加1。最后累加器阵列的最大值对应模型的参数。
代码实现
- 读取原始图并转换成灰度图,采用边缘检测算子(如Canny)转换成二值化边缘图像。
- 然后对该图像进行霍夫变换。
- 先使用峰值检测函数,找到大于阈值的霍夫变换单元(局部最大值应该最可能是线,步长和量化会影响效果。
- 将上述识别出的一组候选峰,需要确定与其相关的线段及其起始点和终止点(这需要一定的算法,很多论文对此都做了改进,诸如蝴蝶形状宽度,峰值走廊)。
- 然后描绘于原图(或结果图)。
-
结果测试与分析(以下是部分代码,项目代码文件打包下载请到我的个人主页查找)
function varargout = GUI(varargin)
% GUI MATLAB code for GUI.fig
% GUI, by itself, creates a new GUI or raises the existing
% singleton*.
%
% H = GUI returns the handle to a new GUI or the handle to
% the existing singleton*.
%
% GUI('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in GUI.M with the given input arguments.
%
% GUI('Property','Value',...) creates a new GUI or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before GUI_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to GUI_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help GUI% Last Modified by GUIDE v2.5 10-Jan-2022 21:51:26% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @GUI_OpeningFcn, ...'gui_OutputFcn', @GUI_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before GUI is made visible.
function GUI_OpeningFcn(hObject, ~, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to GUI (see VARARGIN)% Choose default command line output for GUI
handles.output = hObject;
handles.cd0 = cd;
handles.Color = 0;
handles.I = [];axes(handles.axes1);
set(gca,'Xtick',[]);%去除x轴的刻度
set(gca,'Ytick',[]);%去除y轴的刻度
box on;axes(handles.axes2);
set(gca,'Xtick',[]);
set(gca,'Ytick',[]);
box on;axes(handles.axes3);
set(gca,'Xtick',[]);
set(gca,'Ytick',[]);
box on;axes(handles.axes4);
set(gca,'Xtick',[]);
set(gca,'Ytick',[]);
box on;% Update handles structure
guidata(hObject, handles);% UIWAIT makes GUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = GUI_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;%执行按钮按下读取图片按钮。
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)%% 读图
[filename, cd1] = uigetfile( ...{'*.tif;*.TIF;*.JPG;*.jpg;*.png;*.bmp;*.BMP;*.jpeg;*.JPEG;','Image file';...'*.*', 'All file (*.*)'},'Pick an Image');
axes(handles.axes1);
cla;%清除坐标系,相当于初始化axes
axes(handles.axes2);
cla;
axes(handles.axes3);
cla;
axes(handles.axes4);
cla;
if filenamecd(cd1);%目录d = imread(filename);%获取图片数据cd(handles.cd0);handles.I = d;axes(handles.axes1);%创建坐标系imshow(d);%显示图title('原始图像');handles.filename = filename; box on;%显示右边和上边框end
cd(handles.cd0);
guidata(hObject, handles);//这只是部分代码,完整代码请进入个人主页查看
运行结果测试
1.首先点击运行跳出如下界面。
2.然后点击读取图像按钮将会跳出一个选择图像的窗口,然后就可以选择图像了,如下图所示。
3.读入图像如下所示,得到第一幅 读入的图像,如下图所示。
4.点击第二个按钮 Prewitt边缘检测按钮对图像进行边缘检测,得到边缘检测后的图像,如下所示。
5.点击第三个按钮Hough变换按钮对图像就行Houhg变换,得到第三幅Hough变换图,如下所示。
6.点击第四个按钮对图像进行Hough变换特征检测,得到最后一幅Hough变换直线特征检测图,最后点击退出按钮退出程序,如下。
总结与展望
霍夫变换的大部分效率取决于输入数据的质量:为了使霍夫变换高效,必须检测边缘。在噪声图像上使用Hough变换是一个非常棘手的问题,一般而言,之前必须使用降噪阶段。在图像被斑点破坏的情况下(如雷达图像中的情况),Radon变换有时更适合检测线,因为它通过求和来衰减噪声。一开始实验中的图形界面设计与功能无法更好的结合起来,为此耗费了不少精力,查阅了不少资料,各种百度,B站进行学习,最终才可以完成界面交互。其次也让我了解到了不动手实践,等到真正动手实践才发现理论与实践的差距。同时通过此次课设也让我收获良多。本实验采用的开发工具是MATLAB2014b中文破解版。
这篇关于数字图像处理课程设计Hough变换检测房屋车道等边缘特征的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!