Skip to content

Commit e306085

Browse files
committed
Add edge_prewitt.cpp
1 parent 1e1355f commit e306085

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

Edge detection/edge_prewitt.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include <iostream>
2+
#include <opencv2/core.hpp>
3+
#include <opencv2/highgui.hpp>
4+
#include <opencv2/imgproc.hpp>
5+
6+
void getPrewitt_oper(cv::Mat& getPrewitt_horizontal, cv::Mat& getPrewitt_vertical, cv::Mat& getPrewitt_Diagonal1,cv::Mat& getPrewitt_Diagonal2){
7+
//水平方向
8+
getPrewitt_horizontal = (cv::Mat_<float>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1);
9+
//垂直方向
10+
getPrewitt_vertical = (cv::Mat_<float>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
11+
//对角135°
12+
getPrewitt_Diagonal1 = (cv::Mat_<float>(3, 3) << 0, 1, 1, -1, 0, 1, -1, -1, 0);
13+
//对角45°
14+
getPrewitt_Diagonal2 = (cv::Mat_<float>(3, 3) << -1, -1, 0, -1, 0, 1, 0, 1, 1);
15+
16+
//逆时针反转180°得到卷积核
17+
cv::flip(getPrewitt_horizontal, getPrewitt_horizontal, -1);
18+
cv::flip(getPrewitt_vertical, getPrewitt_vertical, -1);
19+
cv::flip(getPrewitt_Diagonal1, getPrewitt_Diagonal1, -1);
20+
cv::flip(getPrewitt_Diagonal2, getPrewitt_Diagonal2, -1);
21+
}
22+
23+
void edge_Prewitt(cv::Mat& src, cv::Mat& dst1, cv::Mat& dst2, cv::Mat& dst3, cv::Mat& dst4, cv::Mat& dst, int ddepth, double delta = 0, int borderType = cv::BORDER_DEFAULT){
24+
//获取Prewitt算子
25+
cv::Mat getPrewitt_horizontal;
26+
cv::Mat getPrewitt_vertical;
27+
cv::Mat getPrewitt_Diagonal1;
28+
cv::Mat getPrewitt_Diagonal2;
29+
getPrewitt_oper(getPrewitt_horizontal, getPrewitt_vertical, getPrewitt_Diagonal1, getPrewitt_Diagonal2);
30+
31+
//卷积得到水平方向边缘
32+
cv::filter2D(src, dst1, ddepth, getPrewitt_horizontal, cv::Point(-1, -1), delta, borderType);
33+
34+
//卷积得到4垂直方向边缘
35+
cv::filter2D(src, dst2, ddepth, getPrewitt_vertical, cv::Point(-1, -1), delta, borderType);
36+
37+
//卷积得到45°方向边缘
38+
cv::filter2D(src, dst3, ddepth, getPrewitt_Diagonal1, cv::Point(-1, -1), delta, borderType);
39+
40+
//卷积得到135°方向边缘
41+
cv::filter2D(src, dst4, ddepth, getPrewitt_Diagonal2, cv::Point(-1, -1), delta, borderType);
42+
43+
//边缘强度(近似)
44+
cv::convertScaleAbs(dst1, dst1); //求绝对值并转为无符号8位图
45+
cv::convertScaleAbs(dst2, dst2);
46+
47+
48+
49+
50+
51+
cv::convertScaleAbs(dst3, dst3); //求绝对值并转为无符号8位图
52+
cv::convertScaleAbs(dst4, dst4);
53+
dst = dst1 + dst2 ;
54+
//std::cout << dst4 << std::endl;
55+
}
56+
57+
58+
int main(){
59+
cv::Mat src = cv::imread("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Img\\(embedded_square_noisy_512).tif");
60+
if (src.empty()){
61+
return -1;
62+
}
63+
if (src.channels() > 1) cv::cvtColor(src, src, CV_RGB2GRAY);
64+
cv::Mat dst, dst1, dst2, dst3, dst4;
65+
66+
//注意:要采用CV_32F,因为有些地方卷积后为负数,若用8位无符号,则会导致这些地方为0
67+
edge_Prewitt(src, dst1, dst2, dst3, dst4, dst, CV_32F);
68+
69+
cv::namedWindow("src", CV_WINDOW_NORMAL);
70+
imshow("src", src);
71+
cv::namedWindow("水平边缘", CV_WINDOW_NORMAL);
72+
imshow("水平边缘", dst1);
73+
cv::namedWindow("垂直边缘", CV_WINDOW_NORMAL);
74+
imshow("垂直边缘", dst2);
75+
cv::namedWindow("45°边缘", CV_WINDOW_NORMAL);
76+
imshow("45°边缘", dst3);
77+
cv::namedWindow("135°边缘", CV_WINDOW_NORMAL);
78+
imshow("135°边缘", dst4);
79+
cv::namedWindow("边缘强度", CV_WINDOW_NORMAL);
80+
imshow("边缘强度", dst);
81+
cv::waitKey(0);
82+
return 0;
83+
}

0 commit comments

Comments
 (0)