sobel图像预处理

来源:互联网 发布:淘宝白菜群 编辑:程序博客网 时间:2024/06/05 08:54

实现 <<一种微小表面缺陷的机器视觉检测方法>>一文中的预处理

在微小表面缺陷检测中,由于缺陷面积很小,缺陷区域的灰度值变化往往更剧烈. 梯度向量的模值能反映该剧烈变化,且计算量不大. 梯度处理不但能突出图像中的小缺陷,而且能使变化缓慢的背景的特征减弱,大大简化了自动检测的计算任务[8]. 因此,对于背景变化不剧烈的表面图像,可以采用梯度法对表面图像进行增强. 当表面缺陷面积较小时,缺陷形状往往与圆形有一定的相似度,例如孔形、点状、斑状缺陷等,于是用Sobel 算子[8]对图像中3×3大小的邻域计算邻域中心位置像素的梯度幅值,并将该幅值记为g. 设图像的灰度级分为1, 2, · · · , L,如果g>l则灰度值取l,小于l则取g

#include <opencv2/core/core.hpp>#include "opencv2/imgproc/imgproc.hpp"  #include "opencv2/highgui/highgui.hpp"  #include <iostream>  using namespace cv;  using namespace std; int main(){Mat img,img2,img3;//请读入灰度图像img=imread("D:\\ping\\lf1.bmp",0);Mat kernel=(Mat_<uchar>(3,3)<<-1,-2,-1,0,0,0,1,2,1);copyMakeBorder(img,img2,1,1,1,1,BORDER_CONSTANT,Scalar(0) );//边界扩展img2.copyTo(img3);int nc=img2.cols;int nr=img2.rows;int level=250;for(int j=1;j<=nr-2;j++){uchar *p=img2.ptr<uchar>(j);uchar *p1=img3.ptr<uchar>(j);for(int i=1;i<=nc-2;i++){int n;n=abs(-(p+i-nc-1)[0]-2*(p+i-nc-1)[1]-(p+i-nc-1)[2]+(p+i+nc-1)[0]+2*(p+i+nc-1)[1]+(p+i+nc-1)[2])/8;if(n<=level)p1[i]=n;elsep1[i]=level;}}namedWindow("src");namedWindow("result");imshow("src",img);imshow("result",img3); waitKey(0);return 0;} 



不知道是不是我理解错误~怎么感觉就不怎么好看不像那么一回事

0 0
原创粉丝点击