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); }

参考

1.OpenCV实现图像连通组件标记与分析

End

OpenCV-bwLabel-实现图像连通组件标记与分析的更多相关文章

  1. opencv提取截获图像(总结摘来)

    opencv提取截获图像(总结摘来) http://blog.csdn.net/wuxiaoyao12/article/details/7305865 版权声明:本文为博主原创文章,未经博主允许不得转 ...

  2. 使用Matrix控制图像或组件变换的步骤

    1.获取Matrix对象,该Matrix对象既可新创建,也可直接获取其他对象内封装的Matrix(例如Transformation对象内部) 2.调用Matrix的方法进行平移.旋转.缩放.倾斜等. ...

  3. 使用GDI+显示OpenCV中的图像IplImage

    OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...

  4. Django-restframework 源码之认证组件源码分析

    Django-restframework 源码之认证组件源码分析 一 前言 之前在 Django-restframework 的流程分析博客中,把最重要的关于认证.权限和频率的方法找到了.该方法是 A ...

  5. element-ui 组件源码分析整理笔记目录

    element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...

  6. external-provisioner源码分析(3)-组件启动参数分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 external-provisioner源码分析(3)-组件启动参数分析 本文将对extern ...

  7. ceph-csi组件源码分析(1)-组件介绍与部署yaml分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi组件源码分析(1)-组件介绍与部署yaml分析 基于tag v3.0.0 ht ...

  8. ceph-csi源码分析(2)-组件启动参数分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(2)-组件启动参数分析 ceph-csi组件的源码分析分为五部分: ...

  9. 开源MyBatisGenerator组件源码分析

    开源MyBatisGenerator组件源码分析 看源码前,先了解Generator能做什么? MyBatisGenerator是用来生成mybatis的Mapper接口和xml文件的工具,提供多种启 ...

随机推荐

  1. java中的值传递和引用传递用法详解

    值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对 ...

  2. RabbitMQ入门_07_Fanout 与 Topic

    A. 用广播的方式实现发布订阅 参考资料:https://www.rabbitmq.com/tutorials/tutorial-three-java.html Fanout 类型的 Exchange ...

  3. oracle创建/删除表空间、创建/删除用户并赋予权限

    创建表空间 分开执行如下sql语句 --创建临时表空间 CREATE SMALLFILE TEMPORARY TABLESPACE "TEMP11" TEMPFILE 'E:\ap ...

  4. SVN提交文件失败:系统找不到指定路径

    完成程序代码工作后,进行SVN的文件提交.先进行项目的更新,然后在修改的文件上进行提交操作,发现SVN弹出提示信息,“系统找不到指定路径”提交失败,如下图:                       ...

  5. Skills CodeForces - 614D (贪心)

    链接 大意: $n$门课, 第$i$门分数$a_i$, 可以增加共$m$分, 求$cnt_{mx}*cf+mi*cm$的最大值 $cnt_{mx}$为满分的科目数, $mi$为最低分, $cf$, $ ...

  6. CoderForce 141C-Queue (贪心+构造)

    题目大意:一个队伍,每个人只记得前面比他高的人的个数x.现在将队伍散开,问能否构造出一支满足条件的队伍,如果能,再给每个人一个满足题意的身高. 题目分析:一个一个排,x越少越先排,如果x比已经排好的人 ...

  7. spark submit 入门

    spark dirver本质是一个spark集群的驱动程序,你要调用spark集群的计算功能,必须要通过它! from pyspark import SparkConf, SparkContext c ...

  8. jsp config设置jsp页面

    jsp-config jsp-config功能:用于设定jsp页面的相关设置(web.xml 版本在2.4之后) 常用的设置包括 taglib和jsp-property-group两个子元素.其中ta ...

  9. JAVASCRIPT开发HTML5游戏--斗地主(网络对战PART4)

    继之前用游戏引擎(青瓷引擎)做了斗地主单机版游戏之后,这里分享下使用socket.io来实现网络对战,代码可已放到github上,在此谈谈自己整个的开发思路吧. 客户端代码 服务端代码 (点击图片进入 ...

  10. PHP打开空白的解决办法

    先打开错误提示,再查找原因 找到php.ini # 显示错误:On开启,Off关闭 display_errors = On 也可在php文件中加入以下任意一行代码 # 禁用错误报告 error_rep ...