去除小面积轮廓 java_opencv 二值图像剔除小连通区域

本文介绍了如何使用OpenCV的Java接口处理二值图像,通过找到轮廓并剔除面积小于特定阈值的连通区域。首先,通过cv::findContours()获取连通区域,然后利用std::remove_if()结合lambda表达式删除小面积轮廓。最后,使用cv::drawContours()绘制剩余轮廓并填充,以得到去除小面积连通区域的图像。
摘要由CSDN通过智能技术生成

二值图像剔除小面积连通区域在二值图像连通区域分析时很有用,之前做的使用采用了for循环的形式,后来学习了c++标准库,发现可以使用vector.erase(std::remove_if())的方法, 结合lambda表达式直接剔除。

统计二值图像的连通区域通过cv::findcontours()实现,二值图像轮廓的容器是std::vector。连通区域的面积可以由函数cv::contourArea()得到。

剔除小面积连通区域后,可以使用函数cv::drawContours()函数将轮廓画出,将其第三个参数设置为-1为画所有轮廓,将其第5个参数设置为cv::FILLED设置为填充。则可以得到剔除后小面积连通后的二值图像。

#include

#include

#include

int main()

{

cv::Mat img = cv::imread("data/000000000597.jpg");

cv::Mat imgHSV(img.size(), img.type());

cv::cvtColor(img, imgHSV, cv::COLOR_BGR2HSV);

cv::Mat imgHSVMask(img.size(), CV_8UC1);

// yellow color region

cv::inRange(imgHSV, cv::Scalar(11, 43, 46), cv::Scalar(26, 255, 255), imgHSVMask);

char *win1 = "original mask";char *win2 = "after remove";

cv::namedWindow(win1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值