OpenCV-bwLabel-实现图像连通组件标记与分析
OpenCV实现图像连通组件标记与分析- matlab bwLabel;
code:
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std;
RNG rng();
void connected_component_demo(Mat &image);
void connected_component_stats_demo(Mat &image);
int main(int argc, char** argv)
{
Mat src = imread("./src/rice.png");
if (src.empty()) printf("could not load image...\n");
imshow("input", src);
connected_component_stats_demo(src);
connected_component_demo(src);
waitKey();
return ;
} void connected_component_demo(Mat &image)
{
//binarization.
Mat gray, binary;
cvtColor(image, gray, COLOR_BGR2GRAY);
threshold(gray, binary, , , THRESH_BINARY | THRESH_OTSU);
//morphology.
Mat k = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -));
morphologyEx(binary, binary, MORPH_OPEN, k);
morphologyEx(binary, binary, MORPH_CLOSE, k);
imshow("binary", binary);
imwrite("./ccla_binary.png", binary);
Mat labels = Mat::zeros(image.size(), CV_32S);
int num_labels = connectedComponents(binary, labels, , CV_32S);
printf("total labels: %d\n", (num_labels-));
vector<Vec3b> colors(num_labels);
//background color.
colors[] = Vec3b(, , );
//object color.
for (int i = ; i < num_labels; i++)
{
colors[i] = Vec3b(rng.uniform(, ), rng.uniform(, ), rng.uniform(, ));
}
//render result.
Mat dst = Mat::zeros(image.size(), image.type());
int w = image.cols;
int h = image.rows;
for (int row = ; row < h; row++)
{
for (int col = ; col < w; col++)
{
int label = labels.at<int>(row, col);
if (label == ) continue;
dst.at<Vec3b>(row, col) = colors[label];
}
}
imshow("ccla_demo", dst);
imwrite("./ccla_dst.png", dst); } void connected_component_stats_demo(Mat &image)
{
//binarization.
Mat gray, binary;
cvtColor(image, gray, COLOR_BGR2GRAY);
threshold(gray, binary, , , THRESH_BINARY | THRESH_OTSU);
//morphology.
Mat k = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -));
morphologyEx(binary, binary, MORPH_OPEN, k);
morphologyEx(binary, binary, MORPH_CLOSE, k);
imshow("binary", binary);
Mat labels = Mat::zeros(image.size(), CV_32S);
Mat stats, centroids;
int num_labels = connectedComponentsWithStats(binary, labels, stats, centroids, , );
printf("total labels: %d\n", (num_labels-));
vector<Vec3b> colors(num_labels);
//background color.
colors[] = Vec3b(, , );
//object color.
int b = rng.uniform(, );
int g = rng.uniform(, );
int r = rng.uniform(, );
for (int i = ; i < num_labels; i++)
{
colors[i] = Vec3b(, , );
}
//render result.
Mat dst = Mat::zeros(image.size(), image.type());
int w = image.cols;
int h = image.rows;
for (int row = ; row < h; row++)
{
for (int col = ; col < w; col++)
{
int label = labels.at<int>(row, col);
if (label == ) continue;
dst.at<Vec3b>(row, col) = colors[label];
}
} for (int i = ; i < num_labels; i++)
{
Vec2b pt = centroids.at<Vec2d>(i, );
int x = stats.at<int>(i, CC_STAT_LEFT);
int y = stats.at<int>(i, CC_STAT_TOP);
int width = stats.at<int>(i, CC_STAT_WIDTH);
int height = stats.at<int>(i, CC_STAT_HEIGHT);
int area = stats.at<int>(i, CC_STAT_AREA);
printf("area: %d, center point(%.2f, %.2f)\n", area, pt[], pt[]);
circle(dst, Point(pt[], pt[]), , Scalar(, , ), -, , );
rectangle(dst, Rect(x, y, width, height), Scalar(, , ), , , );
}
imshow("ccla-demo", dst);
imwrite("ccla_stats_dst.png", dst); }
参考
End
OpenCV-bwLabel-实现图像连通组件标记与分析的更多相关文章
- opencv提取截获图像(总结摘来)
opencv提取截获图像(总结摘来) http://blog.csdn.net/wuxiaoyao12/article/details/7305865 版权声明:本文为博主原创文章,未经博主允许不得转 ...
- 使用Matrix控制图像或组件变换的步骤
1.获取Matrix对象,该Matrix对象既可新创建,也可直接获取其他对象内封装的Matrix(例如Transformation对象内部) 2.调用Matrix的方法进行平移.旋转.缩放.倾斜等. ...
- 使用GDI+显示OpenCV中的图像IplImage
OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...
- Django-restframework 源码之认证组件源码分析
Django-restframework 源码之认证组件源码分析 一 前言 之前在 Django-restframework 的流程分析博客中,把最重要的关于认证.权限和频率的方法找到了.该方法是 A ...
- element-ui 组件源码分析整理笔记目录
element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...
- external-provisioner源码分析(3)-组件启动参数分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 external-provisioner源码分析(3)-组件启动参数分析 本文将对extern ...
- ceph-csi组件源码分析(1)-组件介绍与部署yaml分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi组件源码分析(1)-组件介绍与部署yaml分析 基于tag v3.0.0 ht ...
- ceph-csi源码分析(2)-组件启动参数分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(2)-组件启动参数分析 ceph-csi组件的源码分析分为五部分: ...
- 开源MyBatisGenerator组件源码分析
开源MyBatisGenerator组件源码分析 看源码前,先了解Generator能做什么? MyBatisGenerator是用来生成mybatis的Mapper接口和xml文件的工具,提供多种启 ...
随机推荐
- Qt5.3.2_CentOS6.4_x86_调试源码关联【勿删,简洁】
1. Qt5.3.2 --> Tools --> Options... --> 左侧选择"Debugger" --> 然后选择"General&q ...
- Qt加载OSg视图例子
//QT += core gui opengl //LIBS += -losgViewer -losgDB -losgUtil -losg -lOpenThreads -losgGA -losgQt ...
- 证明: 2^0+2^1+2^2+2^3+.+2^n-1=(2^n)-1
S=2^0+2^1+2^2+2^3+.+2^(n-1)2S=2^1+2^2+2^3+...+2^(n-1)+2^n两式相减,2S-S=2^n-2^0S=2^(n)-1
- Dalvik VM (DVM) 与Java VM (JVM) 的区别?
Dalvik虚拟机存在于Android系统,JVM是java虚拟机,两者都是虚拟机,本文就对两者进行比较,讲述它们的不同. Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的 ...
- 认识网页:html + css + JavaScript
参考资料:爬虫课程 认识网页 使用chrome,右键检查,查看网页源码,左侧的html,右侧的css,底下的JavaScript. 网页 = HTML(内容) + CSS(样式) + JavaScri ...
- Nodejs AES加密
这几天被一个问题困扰着. Nodejs的AES加密和Java,C#加密出来的不一致.当然,这样就不能解密了. 纠结了许久:后来还是实在不行了,看了下源代码,要不然还得继续纠结下去. 网上说,通常的no ...
- Leetcode 90
// 重复元素在去重的时候会出现顺序不同去不了重,这时候需要对add进行排序class Solution { public: vector<vector<int>> subse ...
- JavaScript学习总结(十二)——JavaScript编写类
在工作中经常用到JavaScript,今天总结一下JavaScript编写类的几种写法以及这几种写法的优缺点,关于JavaScript编写类的方式,在网上看到很多,而且每个人的写法都不太一样,经常看到 ...
- JavaScript学习总结(五)——Javascript中==和===的区别
一.JavaScript"=="的作用 当==两边的内容是字符串时,则比较字符串的内容是否相等. 当==两边的内容是数字时,则比较数字的大小是否相等. 当==两边的内容是对象或者是 ...
- chrome plugins
ehpomnigmfglbkmnboidmmhhmicfdmom_1_1_0知行-时间管理 必开 Adkill and Media Download Cnblogs Wz(博客园网摘) Kami - ...