社区
C++ 语言
帖子详情
使用opencv2.4.9做图像连通域的问题
princeqy
2015-11-24 09:07:03
使用opencv2.4.9做图像连通域,用的是四连通,采用的是two-pass,为什么有时候一个字符会分成两个连通域,也就是说一个字符的连通域从中间断开了,希望知道的大神能告知
...全文
335
2
打赏
收藏
使用opencv2.4.9做图像连通域的问题
使用opencv2.4.9做图像连通域,用的是四连通,采用的是two-pass,为什么有时候一个字符会分成两个连通域,也就是说一个字符的连通域从中间断开了,希望知道的大神能告知
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
赵4老师
2015-11-25
打赏
举报
回复
比如:这个字符?
princeqy
2015-11-25
打赏
举报
回复
比如说一个数字“6”,用opencv的四连通有时候会出现两个连通域,代码如下: void Two_Pass(const cv::Mat& binImg, cv::Mat& lableImg) //两遍扫描法 { if (binImg.empty() || binImg.type() != CV_8UC1) { return; } // 第一个通路 lableImg.release(); binImg.convertTo(lableImg, CV_32SC1); int label = 1; std::vector<int> labelSet; labelSet.push_back(0); labelSet.push_back(1); int rows = binImg.rows - 1; int cols = binImg.cols - 1; for (int i = 1; i < rows; i++) { int* data_preRow = lableImg.ptr<int>(i-1); int* data_curRow = lableImg.ptr<int>(i); for (int j = 1; j < cols; j++) { if (data_curRow[j] == 1) { std::vector<int> neighborLabels; neighborLabels.reserve(2); int leftPixel = data_curRow[j-1]; int upPixel = data_preRow[j]; if ( leftPixel > 1) { neighborLabels.push_back(leftPixel); } if (upPixel > 1) { neighborLabels.push_back(upPixel); } if (neighborLabels.empty()) { labelSet.push_back(++label); // 不连通,标签+1 data_curRow[j] = label; labelSet[label] = label; } else { std::sort(neighborLabels.begin(), neighborLabels.end()); int smallestLabel = neighborLabels[0]; data_curRow[j] = smallestLabel; // 保存最小等价表 for (size_t k = 1; k < neighborLabels.size(); k++) { int tempLabel = neighborLabels[k]; int& oldSmallestLabel = labelSet[tempLabel]; if (oldSmallestLabel > smallestLabel) { labelSet[oldSmallestLabel] = smallestLabel; oldSmallestLabel = smallestLabel; } else if (oldSmallestLabel < smallestLabel) { labelSet[smallestLabel] = oldSmallestLabel; } } } } } } // 更新等价对列表 // 将最小标号给重复区域 for (size_t i = 2; i < labelSet.size(); i++) { int curLabel = labelSet[i]; int preLabel = labelSet[curLabel]; while (preLabel != curLabel) { curLabel = preLabel; preLabel = labelSet[preLabel]; } labelSet[i] = curLabel; } ; for (int i = 0; i < rows; i++) { int* data = lableImg.ptr<int>(i); for (int j = 0; j < cols; j++) { int& pixelLabel = data[j]; pixelLabel = labelSet[pixelLabel]; } } } //彩色显示 cv::Scalar GetRandomColor() { uchar r = 255 * (rand()/(1.0 + RAND_MAX)); uchar g = 255 * (rand()/(1.0 + RAND_MAX)); uchar b = 255 * (rand()/(1.0 + RAND_MAX)); return cv::Scalar(b,g,r); } void LabelColor(const cv::Mat& labelImg, cv::Mat& colorLabelImg) { if (labelImg.empty() || labelImg.type() != CV_32SC1) { return; } std::map<int, cv::Scalar> colors; int rows = labelImg.rows; int cols = labelImg.cols; colorLabelImg.release(); colorLabelImg.create(rows, cols, CV_8UC3); colorLabelImg = cv::Scalar::all(0); for (int i = 0; i < rows; i++) { const int* data_src = (int*)labelImg.ptr<int>(i); uchar* data_dst = colorLabelImg.ptr<uchar>(i); for (int j = 0; j < cols; j++) { int pixelValue = data_src[j]; if (pixelValue > 1) { if (colors.count(pixelValue) <= 0) { colors[pixelValue] = GetRandomColor(); } cv::Scalar color = colors[pixelValue]; *data_dst++ = color[0]; *data_dst++ = color[1]; *data_dst++ = color[2]; } else { data_dst++; data_dst++; data_dst++; } } } } int main() { cv::Mat binImage = cv::imread("test.jpg", 0); cv::threshold(binImage, binImage, 50, 1, CV_THRESH_BINARY_INV); cv::Mat labelImg; Two_Pass(binImage, labelImg, num); //Seed_Filling(binImage, labelImg); //彩色显示 cv::Mat colorLabelImg; LabelColor(labelImg, colorLabelImg); cv::imshow("colorImg", colorLabelImg); /* //灰度显示 cv::Mat grayImg; labelImg *= 10; labelImg.convertTo(grayImg, CV_8UC1); cv::imshow("labelImg", grayImg); */ cv::waitKey(0); return 0; }
vibe算法(
open
cv+c++),RGB
图像
可用
4. **
连通域
分析**:为了去除噪声和小的像素集合,会进行
连通域
分析,将连续的像素连接成一个区域,形成潜在的目标。 5. **后处理**:包括形态学操作,如膨胀和腐蚀,以去除小的噪声斑点并填充目标的空洞。此外,还...
利用种子填充法对二值
图像
进行
连通域
标记
最近一直在用
Open
CV
做
设计,其中有一个设计环节是设计检测二值
图像
的
连通域
及其特征,在网上搜了一下算法,看到了有two-pass法和种子填充法两种。两种经典的方法都编程实现过,个人觉得,种子填充法比较直观,不需要...
【
图像
处理】利用种子填充法对二值
图像
进行
连通域
标记-计算目标中心位置方法2
关于种子填充法的详细原理可以参考
Open
CV_连通区域分析(Connected Component Analysis/Labeling) 大致算法如下: 设二值化
图像
A中,像素值为255的点是前景,为0的点是背景。A(x, y)为坐标(x, y)处的像素值,...
Open
CV各模块函数
使用
实例(7)--其他
图像
变换(Miscellaneous Image Transformations)
在
open
cv的imgproc模块中,其他
图像
变换(Miscellaneous Image transformations)模块中包含了一些
图像
变换...
使用
open
cv2
.
4.9
版和4.3.0以前版本的源码移植。文章主要针对有一定
图像
处理经验的读者。 (1)、voi...
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章