`
237253995
  • 浏览: 24096 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hough变换实现图像纠偏-从matlab到c++实现

 
阅读更多

之前图像处理遇到一个问题,就是因为客户不能用到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.docx

    边缘检测和Hough变换是计算机视觉领域中两个重要的图像处理技术,主要应用于图像分析和模式识别。本实验报告重点探讨了如何使用Matlab实现这两种技术。 **Canny边缘检测** Canny算子是一种广泛使用的边缘检测算法...

    hough变换检测图像中的椭圆Matlab代码

    在描述中提到的`hough.m`文件,很可能是实现Hough变换检测椭圆的Matlab代码。这个代码可能包含以下关键步骤: 1. **预处理**:图像通常需要进行灰度化和二值化,以便更清晰地识别边缘。`im2gray`和`imbinarize`是...

    Hough变换实现椭圆及圆检测(MATLAB)

    总结来说,Hough变换在MATLAB中的椭圆和圆检测是一个从图像预处理到参数空间构建、累加、峰值检测和后处理的完整流程。通过熟练掌握这一方法,我们可以有效地自动检测和识别图像中的几何形状,这对于许多计算机视觉...

    matlab基于hough变换的直线检测

    首先用canny算子检测图像中的边缘,然后利用hough变换检测边缘中的直线,并显示,matlab实现。

    matlab实现HOUGH变换的椭圆检测

    matlab实现HOUGH变换的椭圆检测

    【图像检测】基于 Hough变换实现视频车道线检测matlab源码.md

    【图像检测】基于 Hough变换实现视频车道线检测matlab源码.md

    图像处理 hough变换 matlab

    本篇文章将详细阐述Hough变换的基本原理,以及MATLAB中实现Hough变换的相关函数。 **Hough变换基本原理** Hough变换的核心思想是将图像空间中的几何元素(如直线)转换到参数空间中,形成一个累积的“投票”过程。...

    边缘检测和hough 变换实现边缘检测

    MATLAB作为一种强大的科学计算环境,提供了丰富的图像处理工具箱,包括用于边缘检测的`edge`函数和实现Hough变换的`hough`和`houghpeaks`函数。 1. **边缘检测**: - `edge`函数:这是MATLAB中最常用的边缘检测...

    hough变换的matlab实现

    通过上述步骤,我们不仅能够在MATLAB中成功实现Hough变换,还能够直观地看到该变换在检测图像中直线方面的能力。这一方法在众多领域,如自动驾驶汽车的车道线检测、工业自动化中的零件定位、医学图像分析等,都有着...

    hough变换计算图像倾斜角度

    对于直线检测,我们通常使用Hough线变换,它将图像中的每个像素点映射到参数空间的一个直线,这条直线的斜率和截距对应于参数空间的坐标。当足够多的像素点映射到同一直线上时,这些点在参数空间中的聚集就形成了一...

    毕设源码-基于MATLAB hough变换的表盘刻度识别系统.zip

    基于MATLAB hough变换的表盘刻度识别系统.zip毕设源码-基于MATLAB hough变换的表盘刻度识别系统.zip毕设源码-基于MATLAB hough变换的表盘刻度识别系统.zip毕设源码-基于MATLAB hough变换的表盘刻度识别系统.zip毕设...

    matlab零基础入门图像运算和变换:36 hough变换实现图像直线检测.zip

    总之,"matlab零基础入门图像运算和变换:36 hough变换实现图像直线检测"这套教程将带你走进MATLAB图像处理的世界,让你逐步掌握使用Hough变换进行图像直线检测的全过程。无论是对于学术研究还是工程实践,这都是一...

    数字图像处理课程设计(基于matlab的Hough变换检测图像边缘提取)

    使用matlab app进行图形界面化设计,能够从文件夹中读取文件并在界面上展示,设计多种边缘检测算子与滤波处理和二值化处理,最后通过Hough变换检测进行图像边缘描绘并且能够在界面上显示处理效果。并能将最后的效果...

    matlab图像专题:77 hough变换实现图像直线检测.zip

    在压缩包文件"matlab图像专题:77 hough变换实现图像直线检测"中,包含了详细的MATLAB代码示例和可能的图像数据,通过学习和运行这些示例,你可以更深入地理解Hough变换在MATLAB中的应用,并掌握图像直线检测的方法...

    hough变换检测圆的matlab程序

    通过上述解析可以看出,该MATLAB程序实现了Hough变换检测圆的基本功能,并能够有效地应用于二值图像中的圆检测任务。通过调整半径和阈值参数,用户可以根据具体需求定制检测效果。此外,通过对累积器数组的分析,还...

    【图像识别-表情识别】基于 Hough变换钟表表盘识别Matlab代码.zip

    【图像识别-表情识别】基于 Hough变换钟表表盘识别Matlab代码.zip是一个压缩包,其中包含了关于图像识别和表情识别技术的Matlab实现,特别是利用Hough变换进行钟表表盘检测的方法。Hough变换是一种在图像中寻找特定...

    hough变换-matlab程序

    MATLAB作为一款强大的科学计算软件,提供了实现Hough变换的工具和函数,使得用户能够方便地进行图像分析。 在MATLAB中,Hough变换通常用于检测图像中的直线。当我们有一个二值图像(即黑白图像,其中黑色代表背景,...

    基于Opencv实现的图像纠偏

    本文将深入探讨如何基于OpenCV库实现图像的自动纠偏功能,主要涉及图像二值化、黑边裁剪以及改进的Hough变换。 首先,我们要理解图像纠偏的基本概念。图像纠偏是为了校正由于拍摄或扫描时的倾斜导致的图像角度偏差...

    matlab图像;77 hough变换实现图像直线检测.zip

    在图像处理领域,Hough变换是一种非常...熟练掌握Hough变换及其在MATLAB中的实现,对进行图像处理和计算机视觉研究与开发至关重要。通过不断的实践和实验,可以更好地理解和优化这一过程,提高直线检测的准确性和效率。

    【图像检测-边缘检测】基于Hough霍夫曼算法实现直线检测matlab代码.zip

    【图像检测-边缘检测】基于Hough霍夫曼算法实现直线检测matlab代码.zip这个压缩包文件包含了关于图像处理中的一个重要技术——边缘检测,特别是利用Hough变换进行直线检测的MATLAB实现。Hough变换是一种在图像处理...

Global site tag (gtag.js) - Google Analytics