首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV中的侵蚀

OpenCV中的侵蚀
EN

Stack Overflow用户
提问于 2012-11-26 23:49:10
回答 2查看 1.3K关注 0票数 0

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

代码语言:javascript
复制
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 ]

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

代码语言:javascript
复制
E1 = I & S1 
E2 = I & S2 
E3 = I & S3
E4 = I & S4

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

代码语言:javascript
复制
E = E1 + E2 + E3 + E4

但在使用opencv实现这些功能时,我在早期遇到了一些困难。我像这样声明了元素:

代码语言:javascript
复制
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“,我对这些元素有困难,因为它们不是可接受的类型。我如何使用这些元素来获得上面提到的我想要的侵蚀?提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-27 00:02:01

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

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

代码语言:javascript
复制
cv::Mat S1 = (cv::Mat_<uchar>(3,3) << 0, 1, 0, 0, 1, 0, 0, 1, 0);

您可以通过在终端中显示来确认此操作是否正确:

代码语言:javascript
复制
std::cout << S1 << std::endl;

找到矩阵后,还可以通过简单的算术运算轻松地组合它们,例如:

代码语言:javascript
复制
cv::Mat E = E1 + E2 + E3 + E4;
票数 3
EN

Stack Overflow用户

发布于 2012-11-27 00:16:12

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

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

代码语言:javascript
复制
int S1[3][3] = { { 0, 1, 0 }, { 0, 1, 0 }, { 0, 1, 0 } };
Mat mat1 = Mat(3, 3, CV_32SC1, S1);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13568283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档