点检测(拉普拉斯模板)
线检测模板
水平 +垂直 -
原图:
拉普拉斯:
+:
-
水平
竖直:(结果是这样,不知道为什么)
程序代码:
#include<iostream>
#include"opencv.hpp"
using namespace cv;
using namespace std;
#define N 3
#ifdef _DEBUG
#pragma comment(lib,"opencv_core2413d.lib")
#pragma comment(lib,"opencv_imgproc2413d.lib")
#pragma comment(lib,"opencv_highgui2413d.lib")
#pragma comment(lib,"opencv_features2d2413d.lib")
#pragma comment(lib,"opencv_calib3d2413.lib")
#else
#pragma comment(lib,"opencv_core2413.lib")
#pragma comment(lib,"opencv_imgproc2413.lib")
#pragma comment(lib,"opencv_highgui2413.lib")
#pragma comment(lib,"opencv_features2d2413.lib")
#pragma comment(lib,"opencv_calib3d2413.lib")
#endif
int main(){
//Mat src = imread("Fig1001(a)(constant_gray_region).tif", 0);
//Mat src = imread("Fig1001(d)(noisy_region).tif", 0);
//Mat src = imread("Fig1004(b)(turbine_blade_black_dot).tif", 0);Fig1007(a)(wirebond_mask).tif
Mat src = imread("Fig1007(a)(wirebond_mask).tif", 0);
if (!src.data){
cout << "error src image" << endl;
}
if (src.channels() != 1){
cvtColor(src, src, CV_BGR2HLS);
}
Mat dst=Mat::zeros(src.rows,src.cols,CV_8UC1);
//Laplacian(src, dst, dst.depth(), 3, 1, 0, BORDER_ISOLATED);
//
//imshow("la", dst);
//waitKey();
float sum = 0;
float max = 0;
Point a = (0, 0);
Mat mask = Mat::ones(N, N, src.type());
mask.at<uchar>(N/2, N/2) = -8;
Mat mask1 = Mat::ones(N, N, src.type());
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
mask1.at<uchar>(i, j) = -1;
}
}
mask1.at<uchar>(0, 0) = 2;
mask1.at<uchar>(1, 1) = 2;
mask1.at<uchar>(2, 2) = 2;
Mat mask2 = Mat::ones(N, N, src.type());
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
mask2.at<uchar>(i, j) = -1;
}
}
mask2.at<uchar>(0, 2) = 2;
mask2.at<uchar>(1, 1) = 2;
mask2.at<uchar>(2, 0) = 2;
Mat mask3 = Mat::ones(N, N, src.type());
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
mask3.at<uchar>(i, j) = -1;
}
}
mask3.at<uchar>(1, 0) = 2;
mask3.at<uchar>(1, 1) = 2;
mask3.at<uchar>(1, 2) = 2;
Mat mask4 = Mat::ones(N, N, src.type());
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
mask4.at<uchar>(i, j) = -1;
}
}
mask4.at<uchar>(0, 1) = 2;
mask4.at<uchar>(1, 1) = 2;
mask4.at<uchar>(2, 1) = 2;
for (int i = N / 2; i < src.rows - N; i++){
for (int j = N / 2; j < src.cols - N; j++){
sum = 0;
for (int m = -N/2; m < N/2+1; m++){
for (int n = -N / 2; n < -N / 2+1; n++){
sum += src.at<uchar>(i + m, j + n)*mask4.at<uchar>(m + N / 2, n+N / 2);
}
}
if (abs(sum)>195075)
cout << sum << endl;
dst.at<uchar>(i, j) = abs(sum);
//if (dst.at<uchar>(i, j) >max){
// max = dst.at<uchar>(i, j);
//}
}
}
//for (int i = 0; i < dst.rows; i++){
// for (int j = 0; j < dst.cols; j++){
// if (dst.at<uchar>(i, j)>max*0.9){
// dst.at<uchar>(i,j) = 255;
// a.x = i;
// a.y = j;
// }
// else
// dst.at<uchar>(i,j)= 0;
// }
//}
//meanStdDev(src, dst, dev, mask);
//threshold(src, dst, 200, 255, THRESH_BINARY);
cout << a << endl;
imshow("dst", dst);
waitKey();
return 0;
}
参考文献:
冈萨雷斯 数字图像处理 第三版