在图像处理中我们常常需要提取目标图像中的ROI区域或这是某个形状,这样我们就需要观察对象的特征,根据它的特征去提取。
这次我们在下图中提取其中的圆

基本思路

1、二值化处理
2、形态学操作(开与闭)去除干扰
3、提取轮廓,通过轮廓的面积大小与横纵比过滤
4、获取目标图像数据并标记

代码

# include<opencv2\opencv.hpp>
# include <iostream>
# include <math.h>
using namespace std;
using namespace cv;
Mat src, dst,binary;
int main(int argc, char** argv) {src = imread("E:/tuku/case003.png",IMREAD_GRAYSCALE);if (src.empty()) {cout << "can't find this picture...";return -1;}Rect roi = Rect(30, 30, src.cols - 50, src.rows - 50);Mat ROI = src(roi);imshow("input", ROI);//二值化threshold(ROI, binary, 0, 255, THRESH_BINARY_INV|THRESH_OTSU);imshow("binary Image", binary);//形态学操作(先闭操作再开操作)Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));morphologyEx(binary, dst, MORPH_CLOSE, kernel);imshow("colse Image", dst);kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));morphologyEx(dst, dst, MORPH_OPEN, kernel);imshow("open Image", dst);//提取轮廓vector<vector<Point>> contours;vector<Vec4i>hierachy;findContours(dst, contours, hierachy, RETR_TREE,CHAIN_APPROX_SIMPLE,Point(-1,-1));Mat ResultImage = Mat::zeros(ROI.size(), CV_8UC3);//Mat circleImage = ROI.clone();//cvtColor(circleImage, circleImage, COLOR_GRAY2BGR);Point cc;for (size_t t = 0; t < contours.size(); t++) {//面积过滤double area = contourArea(contours[t]);if (area < 150)continue;//横纵比过滤Rect rect = boundingRect(contours[t]);//最小的外接矩形float radio = float(rect.height) / float(rect.width);if (radio<1.1&&radio>0.9) {drawContours(ResultImage, contours, t, Scalar(0, 0, 255), -1, 8, Mat(), 0, Point());printf("circle area :%f\n", area);printf("circle length:%f\n", arcLength(contours[t], true));//周长计算int x = rect.x + rect.width / 2;int y = rect.y + rect.height / 2;cc = Point(x, y);circle(ResultImage, cc, 2, Scalar(0, 0, 255), 2, 8, 0);printf("圆心坐标:(%d,%d)", x, y);}}imshow("result Image", ResultImage);Mat circleImage = ROI.clone();cvtColor(circleImage, circleImage, COLOR_GRAY2BGR);circle(circleImage, cc, 2, Scalar(0, 0, 255), 2, 8, 0);imshow("Final Result Image", circleImage);//detect circle/*vector<Vec3f>Mycircle;Mat grat_result;cvtColor(ResultImage, grat_result, COLOR_GRAY2BGR);HoughCircles(grat_result, Mycircle, HOUGH_GRADIENT, 1, 7, 50, 20, 23, 100);Mat circleImage = ROI.clone();cvtColor(circleImage, circleImage, COLOR_GRAY2BGR);for (int i = 0; i < Mycircle.size(); i++) {Vec3f circleInfo = Mycircle[i];circle(circleImage, Point(circleInfo[0], circleInfo[1]), circleInfo[2], Scalar(0, 0, 255), 2, 8, 0);}imshow("Final Result Image", circleImage);*/waitKey(0);return 0;
}

效果图:

【opencv小案例-对象提取】阈值分割+形态学处理+面积横纵比过滤相关推荐

  1. 【python ++ opencv + pytorch 】车牌提取、分割、识别

    话不多说,先看最后成果图(如果想要全部工程,文章最后我会把github链接放上): 可以看到最终的识别车牌号码是:苏G99999. 其实前年冬天偶然想着用c++来做一个小项目,然后就用 c++ ope ...

  2. opencv学习笔记10:阈值分割

    阈值分割 像素图 原始图像像素图 见下面 红色线:标注一条阈值线 二进制阈值化 首先设定一条阀值线 如127 大于127的像素点灰度值设为最大(如unit8的格式为255) 小于127的像素点灰度值设 ...

  3. 基于OpenCV和C++实现最大阈值分割算法

    代码如下:: /******************************************************************************************** ...

  4. Opencv中的大津阈值分割算法

    大津阈值分割算法,返回的阈值可以用于分割图像,对图像进行二值化处理.边缘检测等. 输入: Mat 类型的地址(如Otsu(&src);) 输出: 返回一个int类型的阈值. int Otsu( ...

  5. 【python + opencv + pytorch】车牌提取、分割、识别 pro版

    老规矩,先看最后成果图(如果想要全部工程,文章最后我会把github链接放上) 1.分割车牌 2.分割字符 3.识别字符 最终识别的车牌号码是:浙F99999 整个车牌识别分五步: 1.一个分割车牌的 ...

  6. opencv 二值化 python_Python OpenCV 图像二值化-阈值分割

    1.二值化处理 # 手动二值化处理 # 设置阈值大小 threshold thresh = 125 # 设置超过阈值像素值的最大值 maxval = 255 # THRESH_BINARY:超过阈值为 ...

  7. C++ opencv基于OTSU图像多阈值分割

    vector<double> sub(vector<int> A, vector<double> B) //减法 {vector<double> C;C ...

  8. OpenCV小案例——批量图片合成为视频

    # 将某个文件夹下面的图片转化为一个视频 def png_to_video(dir_path):fps = 8size = (378, 512)video = cv2.VideoWriter(&quo ...

  9. OpenCV小案例(2)——判断一张图片中多少种颜色

    其实这个函数超级简单: img = Image.open(file_path) color = img.getcolors() 返回值是整数类型的数字. 有人会想,这两句话,我们可以用来干嘛呢? 比如 ...

最新文章

  1. 79年后,中国人口将不到10亿,我国的生育率为何上不去了?
  2. 已知p是一个指向类a的数据成员m的指针_第三十八章、结构体指针、单向链表简介...
  3. c++ queue学习
  4. 如何使用用window.open()
  5. 解决Based on configured schedule, the given trigger ‘triggerGroupName_FREEZE_JOB.triggerName_FREEZE...
  6. 粗谈MySQL事务的特性和隔离级别
  7. .Net 高效开发之不可错过的实用工具
  8. 医用计算机基础学习心得,计算机基础学习心得.doc
  9. Python 将json字符串 进行列表化可循环
  10. 单机部署RabbltMQ环境的操作记录
  11. linux上mysql定时备份数据库数据_Linux下如何实现MySQL数据库每天定时自动备份
  12. 安卓自定义相机拍照功能全解(不调用系统相机)
  13. 征稿通知 | 2019亚洲语言处理国际大会(IALP2019)开始征稿
  14. 【WPF】在MenuItem中下划线“_”显示不正常
  15. EthBox以太坊开发套件,一键安装部署以太坊开发环境
  16. CAD制图教程:CAD软件中怎么画圆弧梯段?
  17. 书籍推荐《麦肯锡教我的写作武器》
  18. 通过人工智能实现内容智能审核及在世界杯的实战
  19. 如何用手机数据线连接电脑上网?
  20. 推荐 :35个国内外社会科学数据网站资源汇总(附链接)

热门文章

  1. 2019年安徽省大学生计算机博弈大赛,2019年辽宁省普通高等学校本科大学生计算机博弈竞赛在我校成功举行...
  2. 4K 显示器突然变模糊了怎么调回来
  3. Oracle 技巧总结 (二):nvl() 函数
  4. Canva在线免费图表制作工具
  5. XX^{T} 和 X^{T}X 的关系
  6. 更改计算机浏览视图,来,一起认识查看、编辑幻灯片时不同的视图方式—想象力电脑应用...
  7. 产品目标—在敏捷团队中使用目标和关键结果(OKRs)
  8. [HTML] kbd 标签
  9. HTML“计算机输出”标签 codekbdsampttvarpre
  10. python使用excel数据分析统计服_像Excel一样使用python进行数据分析