本文主要是介绍击中击不中的变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.1 击中击不中的步骤
击中击不中变换是形态学形状检测的基本工具。
步骤为:
- 使用模板s1腐蚀原图像X
- 使用模板s2(s2为是s1的补)对Y(Y为X的补)进行腐蚀
- 对两个结果进行取交集
用击中结构去腐蚀原始图像得到击中结果X(这个过程可以理解为在原始图像中寻找和击中结构完全匹配的模块,匹配上了之后,保留匹配部分的中心元素,作为腐蚀结果的一个元素),然后用击不中结构去腐蚀原始图像的补集得到击不中结果Y(即在原始图像上找到击不中结构与原始图像没有交集的位置,这个位置的元素保留,作为腐蚀结果的一个元素),取X和Y的交集就是击中-击不中的结果。 通俗理解就是:用一个小的结构元素(击中结构)去射击原始图像,击中的元素保留;再用一个很大的结构元素(击不中,一般取一个环状结构)去射击原始图像,击不中原始图像的位置保留。满足击中元素能击中and击不中元素不能击中的位置的元素就是最终的形状结果。
1.2 击中击不中opencv实现
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
int main() {Mat input_image = imread("lena.jpg", 2);imshow("Hit or Miss原图", input_image);Mat kernel1 = (Mat_<int>(3, 3) <<0, 1, 0,1, -1, 1,0, 1, 0);Mat kernel2 = (Mat_<int>(3, 3) <<0, 1, 0,1, 0, 1,0, 1, 0);Mat kernel3 = (Mat_<int>(3, 3) <<0, 0, 0,0, 1, 0,0, 0, 0);Mat output_image, output_image1,output_image2,output_image3,output_image4;Mat element = getStructuringElement(0, Size(3, 3), Point(-1, -1));erode(input_image, output_image3, element);imshow("腐蚀图", output_image3);morphologyEx(input_image, output_image1, MORPH_HITMISS, kernel3);morphologyEx(input_image, output_image2, MORPH_HITMISS, kernel2);morphologyEx(input_image, output_image, MORPH_HITMISS, kernel1);imshow("Hit or Miss0", output_image1);imshow("Hit or Miss1", output_image2);imshow("Hit or Miss", output_image);cv::absdiff(output_image1, output_image2, output_image4);cv::imshow("Hit or Miss2", output_image4);waitKey(0);return 0;
}
Mat s1 = (Mat_<int>(3, 3) <<
0, 0, 0,
0, 1, 0,
0, 0, 0);
Mat s2 = (Mat_<int>(3, 3) <<
0, 1, 0,
1, 0, 1,
0, 1, 0);
Mat s3 = (Mat_<int>(3, 3) <<
0, 1, 0,
1, -1, 1,
0, 1, 0);
s3是直接用s2-s1所得
1.3 击中击不中效果
图1 原图 图2 使用s1腐蚀结果 图3 使用s2腐蚀结果
图4 图3与图2的交集 图5 直接使用s3腐蚀的结果
参考:https://blog.csdn.net/horseinch/article/details/50127955
这篇关于击中击不中的变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!