OpenCV中的侵蚀

时间:2012-11-26 15:49:10

标签: c++ image image-processing opencv

我正在尝试使用OpenCV执行图像侵蚀。我想这样做:假设我有四个不同的元素

S1 = [ 0 1 0, 0 1 0, 0 1 0 ]
S2 = [ 0 0 0, 1 1 1, 0 0 0 ]
S3 = [ 0 0 1, 0 1 0, 1 0 0 ]
S4 = [ 0 1 0, 1 1 1, 0 1 0 ]

我想在原始图像上使用这些元素执行四种不同的侵蚀:

E1 = I & S1 
E2 = I & S2 
E3 = I & S3
E4 = I & S4

其中“我”是原始图像,我使用“&”为了简单起见,表示侵蚀。然后我想通过添加这四个来获得最终的侵蚀:

E = E1 + E2 + E3 + E4

但是当用opencv实现这些时,我在早期遇到了困难。我宣布了这样的元素:

int S1[3][3] = { { 0, 1, 0 }, { 0, 1, 0 }, { 0, 1, 0 } };
int S2[3][3] = { { 0, 0, 0 }, { 1, 1, 1 }, { 0, 0, 0 } };
int S3[3][3] = { { 0, 0, 1 }, { 0, 1, 0 }, { 1, 0, 0 } }; 
int S4[3][3] = { { 0, 1, 0 }, { 1, 1, 1 }, { 0, 1, 0 } };

然后使用“cv :: erode”我对这些元素有困难,因为它们不是可接受的类型。我如何使用这些元素来获得上述所需的侵蚀?先感谢您。

2 个答案:

答案 0 :(得分:3)

您可能需要从所需的内核形状创建cv::Mat,这些形状称为结构元素,OpenCV提供getStructuringElement函数来创建一些常见形状。

或者,您可以通过使用以下内容直接从数据创建新矩阵来形成自己的矩阵:

cv::Mat S1 = (cv::Mat_<uchar>(3,3) << 0, 1, 0, 0, 1, 0, 0, 1, 0);

您可以通过在终端中显示它来确认这是否正确:

std::cout << S1 << std::endl;

一旦找到了矩阵,它们也可以通过简单的算术运算轻松组合,例如:

cv::Mat E = E1 + E2 + E3 + E4;

答案 1 :(得分:1)

使用Mat - 对象作为内核。在大多数情况下,InputArrayOutputArray(请参阅erode纪录片)可以是Mats或std :: vector对象。

我认为你可以像这样初始化它(未经测试):

int S1[3][3] = { { 0, 1, 0 }, { 0, 1, 0 }, { 0, 1, 0 } };
Mat mat1 = Mat(3, 3, CV_32SC1, S1);