之前图像处理遇到一个问题,就是因为客户不能用到matlab库,所以需要在c/c++中实现。
先来看看matlab中的代码:
I1=imread('0130924171417906.jpg');%读入待处理的彩色图 % I=1/3*I1(:,:,1)+1/3*I1(:,:,2)+1/3*I1(:,:,3);%将原始图像转化为灰度图像 I = rgb2gray(I1);%转换成灰度图 [x,y]=size(I) BW=edge(I,'sobel',0.18); %运用Sobel算子进行边缘检测,你的是Canny算子 rho_max=floor(sqrt(x^2+y^2))+1; %由原图数组坐标算出ρ最大值,并取整数部分加1,此值作为ρ,θ坐标系ρ最大值 accarray=zeros(rho_max,180); %定义ρ,θ坐标系的数组,初值为0,θ的最大值,180度 Theta=[0:pi/180:pi]; %定义θ数组,确定θ取值范围 for n=1:x for m=1:y if BW(n,m)==1 for k=1:180 rho=(m*cos(Theta(k)))+(n*sin(Theta(k))); %将θ值代入hough变换方程,求ρ值 rho_int=round(rho/2+rho_max/2); %将ρ值与ρ最大值的和的一半作为ρ的坐标值(数组坐标),这样做是为了防止ρ值出现负数 %在ρθ坐标(数组)中标识点,即计数累加 accarray(rho_int,k)=accarray(rho_int,k)+1; end end end end // /*********************************/ R=max(accarray); a=find(R==max(R))-1 %找到使数组accarray取得最大值的角度
转化为c/c++中实现如下:
//hough变换 int x = bmp.bih.biWidth; int y = bmp.bih.biHeight; double rho; int rho_int; int rho_max = 0; rho_max =(int)floor(sqrt(x * x + y * y + 0.0))+1; //由原图数组坐标算出ρ最大值,并取整数部分加1,此值作为ρ,θ坐标系ρ最大值 int *c = new int[rho_max * (180 + 1)]; int (*accarray)[180 + 1] = (int(*)[180 + 1])c; for (i = 0; i < rho_max; i++) for (j = 0; j <= 180; j++) accarray[i][j] = 0; //定义θ数组,确定θ取值范围 /** * x=[0:0.5:360] :x是一个从0到360以0.5为间距的向量 (数组)乘以pi除以180 搜索, */ // Theta=[0:pi/180:pi]; double Theta[181]; //算出0~180度的弧度值 //Theta=(double *)malloc(sizeof(double *)*(180 + 1)); // 定义θ数组,确定θ取值范围 for (int i = 0;i <= 180;i++) { Theta[i] = (i / 360.0) * 2 * PI; } // for (int n = 0;n < x;n++) { for (int m = 0;m < y;m++) { if (g[m * (bih.biWidth+nAdjust24) + n] == 255) { //边缘的条件 for (int k = 0;k <= 180;k++){ //printf("%d",k); rho=(n*cos(Theta[k]))+(m*sin(Theta[k]));//将θ值代入hough变换方程,求ρ值 //printf("ρ:%d\n",rho); //将ρ值与ρ最大值的和的一半作为ρ的坐标值(数组坐标),这样做是为了防止ρ值出现负数 int temp = rho/2+rho_max/2; //在ρθ坐标(数组)中标识点,即计数累加 accarray[temp][k]++; //printf("%d",accarray[temp][k]); } } } } int *R;//找出每个角度对应的最大值 R=(int *)malloc(sizeof(int *)* (180 + 1)); for (int k = 0;k <= 180;k++) { R[k] = 0; } for (int k = 0;k <= 180;k++) { int tempMax = 0; for (int i = 0;i < rho_max;i++){ if (accarray[i][k] > tempMax) { tempMax = accarray[i][k]; R[k] = accarray[i][k]; } } //printf("%d-角度:%d\n",R[k],k); } int max_angle = 1; int max_value = R[1]; for (int k = 1;k <= 180;k++) { if (R[k] > max_value) { max_value = R[k]; max_angle = k; } } int b_w = bih.biWidth; int b_h = bih.biHeight; //max_angle-=1; //pData24 = imRotate(bmp,-7); //max_angle = 104; //printf("最大直线所在角度:%d\n",max_angle);
希望可以给大家带来参考!
相关推荐
边缘检测和Hough变换是计算机视觉领域中两个重要的图像处理技术,主要应用于图像分析和模式识别。本实验报告重点探讨了如何使用Matlab实现这两种技术。 **Canny边缘检测** Canny算子是一种广泛使用的边缘检测算法...
在描述中提到的`hough.m`文件,很可能是实现Hough变换检测椭圆的Matlab代码。这个代码可能包含以下关键步骤: 1. **预处理**:图像通常需要进行灰度化和二值化,以便更清晰地识别边缘。`im2gray`和`imbinarize`是...
总结来说,Hough变换在MATLAB中的椭圆和圆检测是一个从图像预处理到参数空间构建、累加、峰值检测和后处理的完整流程。通过熟练掌握这一方法,我们可以有效地自动检测和识别图像中的几何形状,这对于许多计算机视觉...
首先用canny算子检测图像中的边缘,然后利用hough变换检测边缘中的直线,并显示,matlab实现。
matlab实现HOUGH变换的椭圆检测
【图像检测】基于 Hough变换实现视频车道线检测matlab源码.md
本篇文章将详细阐述Hough变换的基本原理,以及MATLAB中实现Hough变换的相关函数。 **Hough变换基本原理** Hough变换的核心思想是将图像空间中的几何元素(如直线)转换到参数空间中,形成一个累积的“投票”过程。...
MATLAB作为一种强大的科学计算环境,提供了丰富的图像处理工具箱,包括用于边缘检测的`edge`函数和实现Hough变换的`hough`和`houghpeaks`函数。 1. **边缘检测**: - `edge`函数:这是MATLAB中最常用的边缘检测...
通过上述步骤,我们不仅能够在MATLAB中成功实现Hough变换,还能够直观地看到该变换在检测图像中直线方面的能力。这一方法在众多领域,如自动驾驶汽车的车道线检测、工业自动化中的零件定位、医学图像分析等,都有着...
对于直线检测,我们通常使用Hough线变换,它将图像中的每个像素点映射到参数空间的一个直线,这条直线的斜率和截距对应于参数空间的坐标。当足够多的像素点映射到同一直线上时,这些点在参数空间中的聚集就形成了一...
基于MATLAB hough变换的表盘刻度识别系统.zip毕设源码-基于MATLAB hough变换的表盘刻度识别系统.zip毕设源码-基于MATLAB hough变换的表盘刻度识别系统.zip毕设源码-基于MATLAB hough变换的表盘刻度识别系统.zip毕设...
总之,"matlab零基础入门图像运算和变换:36 hough变换实现图像直线检测"这套教程将带你走进MATLAB图像处理的世界,让你逐步掌握使用Hough变换进行图像直线检测的全过程。无论是对于学术研究还是工程实践,这都是一...
使用matlab app进行图形界面化设计,能够从文件夹中读取文件并在界面上展示,设计多种边缘检测算子与滤波处理和二值化处理,最后通过Hough变换检测进行图像边缘描绘并且能够在界面上显示处理效果。并能将最后的效果...
在压缩包文件"matlab图像专题:77 hough变换实现图像直线检测"中,包含了详细的MATLAB代码示例和可能的图像数据,通过学习和运行这些示例,你可以更深入地理解Hough变换在MATLAB中的应用,并掌握图像直线检测的方法...
通过上述解析可以看出,该MATLAB程序实现了Hough变换检测圆的基本功能,并能够有效地应用于二值图像中的圆检测任务。通过调整半径和阈值参数,用户可以根据具体需求定制检测效果。此外,通过对累积器数组的分析,还...
【图像识别-表情识别】基于 Hough变换钟表表盘识别Matlab代码.zip是一个压缩包,其中包含了关于图像识别和表情识别技术的Matlab实现,特别是利用Hough变换进行钟表表盘检测的方法。Hough变换是一种在图像中寻找特定...
MATLAB作为一款强大的科学计算软件,提供了实现Hough变换的工具和函数,使得用户能够方便地进行图像分析。 在MATLAB中,Hough变换通常用于检测图像中的直线。当我们有一个二值图像(即黑白图像,其中黑色代表背景,...
本文将深入探讨如何基于OpenCV库实现图像的自动纠偏功能,主要涉及图像二值化、黑边裁剪以及改进的Hough变换。 首先,我们要理解图像纠偏的基本概念。图像纠偏是为了校正由于拍摄或扫描时的倾斜导致的图像角度偏差...
在图像处理领域,Hough变换是一种非常...熟练掌握Hough变换及其在MATLAB中的实现,对进行图像处理和计算机视觉研究与开发至关重要。通过不断的实践和实验,可以更好地理解和优化这一过程,提高直线检测的准确性和效率。
【图像检测-边缘检测】基于Hough霍夫曼算法实现直线检测matlab代码.zip这个压缩包文件包含了关于图像处理中的一个重要技术——边缘检测,特别是利用Hough变换进行直线检测的MATLAB实现。Hough变换是一种在图像处理...