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