倾斜角检测

本文介绍了使用OpenCV进行图像处理的方法,包括固定阈值二值化处理和霍夫变换来检测图像中的直线。通过计算得到直线的角度并进行了角度转换。

// 固定阈值二值化处理
  cv::Mat binaryMagnMat;
  threshold(magnitudeMat,binaryMagnMat,
     132,255,CV_THRESH_BINARY);
  cv::imshow("binaryMagnMat", binaryMagnMat);
  // 霍夫变换
  vector<Vec2f> lines;
  binaryMagnMat.convertTo(binaryMagnMat,CV_8UC1,255,0);
  HoughLines(binaryMagnMat, lines, 1, CV_PI/180, 100, 0, 0 );
  // 检测线个数
  std::cout << "lines.size:"<< lines.size() << std::endl;
  cv::Mat houghMat(binaryMagnMat.size(),CV_8UC3);
  for( size_t i = 0; i < lines.size(); i++ )
  // 绘制检测线
  {
      float rho = lines[i][0], theta = lines[i][1];
      Point pt1, pt2;
      // 坐标变换生成线表达式
      double a = cos(theta), b = sin(theta);
      double x0 = a*rho, y0 = b*rho;
      pt1.x = cvRound(x0 + 1000*(-b));
      pt1.y = cvRound(y0 + 1000*(a));
      pt2.x = cvRound(x0 - 1000*(-b));
      pt2.y = cvRound(y0 - 1000*(a));
      line( houghMat, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
  }
  cv::imshow("houghMat", houghMat);
  float theta = 0;
  // 检测线角度判断
  for( size_t i = 0; i < lines.size(); i++ )
  {
    float  thetaTemp = lines[i][1]*180/CV_PI;
    if(thetaTemp > 0 && thetaTemp < 90)
    {
        theta = thetaTemp;
        break;
    }
  }
  // 角度转换
  float angelT = nRows* tan(theta/180*CV_PI)/nCols;
  theta = atan(angelT)*180/CV_PI;
  std::cout << "theta:" << theta << std::endl;



转载:http://blog.youkuaiyun.com/zhuwei1988

### Matlab 中实现图像倾斜角检测与校正 在Matlab中,可以采用一系列方法来完成图像倾斜角度的检测以及后续的校正操作。此过程通常涉及几个主要阶段:预处理、特征提取(如边缘检测)、应用霍夫变换以识别可能存在的直线结构并由此推算出倾斜角度,最后基于所得到的角度信息对原始图像实施旋转调整。 #### 预处理阶段 为了提高后续步骤的效果,在开始之前应对输入图像执行必要的预处理措施。这包括但不限于将彩色图转换成灰度形式以便简化计算流程;运用滤波器消除不必要的噪点干扰,从而增强目标对象轮廓清晰度[^3]。 ```matlab % 将RGB图像转化为灰度图像 grayImage = rgb2gray(originalImage); % 使用高斯平滑滤波减少噪声影响 filteredGrayImage = imgaussfilt(grayImage, 2); ``` #### 边缘检测 接着是对经过初步净化后的灰度化图像施行边缘检测技术,目的是突出显示那些最有可能代表文档边界或其他显著几何形状的部分。常用的是Canny算子或者其他类似的二阶导数零交叉点探测机制,它们能够有效地捕捉到强度变化剧烈之处即所谓的“边缘”。 ```matlab % 应用Canny边缘检测算法 edgeDetectedImage = edge(filteredGrayImage,'Canny'); ``` #### Hough 变换用于线条检测 一旦获得了含有明显边缘的信息之后,则可通过调用`houghlines()`函数配合先前由`houghpeaks()`找到的关键峰值位置来进行精确的直线条目定位。这些被挑选出来的线段将成为估算整体偏转程度的重要依据之一。 ```matlab [H,T,R] = hough(edgeDetectedImage); % 计算Hough变换矩阵 P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:)))); % 寻找高峰值作为候选直线 lines = houghlines(edgeDetectedImage,T,R,P,'FillGap',5,'MinLength',7); % 获取具体的直线参数 ``` #### 倾斜角度计算 有了上述获取的一系列潜在直线数据后,便可以根据每条记录下的theta属性平均值得知整个画面大致朝向何方发生了偏离现象。这里假设所有选取样本都指向同一个方向的话,那么其共同构成的那个矢量就反映了实际拍摄过程中纸张摆放姿态的变化情况。 ```matlab angles = []; for k = 1:length(lines) xy = [lines(k).point1; lines(k).point2]; angles(end+1) = atan((xy(2,2)-xy(1,2))/(xy(2,1)-xy(1,1))) * (180/pi); end meanAngle = mean(angles); ``` #### 图像校正 最终一步就是按照前面求得的结果反向修正原片中存在的歪曲状况了。借助内置工具箱里的仿射变换功能很容易就能达成这一目的,只需指定好中心坐标系下新的方位角即可让系统自动完成相应变形动作。 ```matlab rotatedImage = imrotate(originalImage,-meanAngle,'bilinear','crop'); % 对原图做逆时针旋转纠正 imshow(rotatedImage); title('Corrected Image After Rotation Adjustment') ``` 通过以上介绍可以看出,在Matlab环境下开展针对平面文件类别的影像资料进行自动化纠偏作业是一项既实用又充满挑战的任务。不仅考验编程技巧同时也涉及到多学科领域内专业知识的应用能力[^1]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值