您的位置:首页 > 其它

sobel图像预处理

2015-09-01 17:29 155 查看
实现 <<一种微小表面缺陷的机器视觉检测方法>>一文中的预处理

在微小表面缺陷检测中,由于缺陷面积很小,缺陷区域的灰度值变化往往更剧烈. 梯度向量的模值能反映该剧烈变化,且计算量不大. 梯度处理不但能突出图像中的小缺陷,而且能使变化缓慢的背景的特征减弱,大大简化了自动检测的计算任务[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;
else
p1[i]=level;

}

}
namedWindow("src");
namedWindow("result");
imshow("src",img);
imshow("result",img3);

waitKey(0);
return 0;

}




不知道是不是我理解错误~怎么感觉就不怎么好看不像那么一回事
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: