一,动态自适应

'''
此方法是一种动态自适应找圆方法
使用方法:
im_floodfill = get_adaptive_circle(crop_img)
输入原图crop_img
返回mask'''import os
import cv2
import numpy as np# 求最大连通域的中心点坐标
# def centroid(max_contour):
#     moment = cv2.moments(max_contour)
#     if moment['m00'] != 0:
#         cx = int(moment['m10'] / moment['m00'])
#         cy = int(moment['m01'] / moment['m00'])
#         return cx, cy
#     else:
#         return Nonedef fillHole(im_in):im_floodfill = im_in.copy()im_floodfill = np.uint8(im_floodfill)row, col, dim = im_floodfill.shape# Mask used to flood filling# Notice the size needs to be 2 pixels than the imagemask = np.zeros((row+2, col+2), np.uint8)# Floodfill from point int(row/2), int(col/2)cv2.floodFill(im_floodfill, mask, (int(row/2), int(col/2)), (255, 255,255))# cv2.morphologyEx(im_floodfill, cv2.MORPH_ELLIPSE, mask)return im_floodfilldef get_adaptive_circle(crop_img):ori_row, ori_col, ori_dim = crop_img.shapeimg = cv2.resize(crop_img, (240, 270))row, col, dim = img.shapegray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图像edges = cv2.Canny(gray, 100, 200)kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))  # 圆形kernelclosing = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel, 100)# 提取边缘contours, hierarchy = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 找到最大的contourarea = []for j in range(len(contours)):area.append(cv2.contourArea(contours[j]))max_idx = np.argmax(area)# 求椭圆ellipse = cv2.fitEllipse(contours[max_idx])  #  [ (x, y) , (a, b), angle ]ellipse_img = np.zeros((row, col, dim))cv2.ellipse(ellipse_img, ellipse, (255, 255, 255), 2)# 填充椭圆ellipse_fill = fillHole(ellipse_img)ellipse_fill = cv2.resize(ellipse_fill, (ori_row, ori_col))ret, ellipse_fill = cv2.threshold(ellipse_fill[:, :, 0], 0, 255, cv2.THRESH_BINARY | cv2.THRESH_TRIANGLE)# cv2.imshow('Canny', edges)# cv2.imshow('closing', closing)# cv2.imshow('ellipse_img', ellipse_img)# cv2.imshow('ellipse_fill', ellipse_fill)## cv2.waitKey(0)return ellipse_fillif __name__ == '__main__':img = cv2.imread("/home/1.png")crop_img = img[650:1400, 1000:1750]ellipse = get_adaptive_circle(crop_img)# save_img_path = os.path.join(save_path, imgs_list[i])# cv2.imwrite(save_img_path, ellipse)
cv2.Canny(img, threshold1, threshold2)

https://www.cnblogs.com/aoru45/p/9763988.html

其中,较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。

函数返回的是二值图,包含检测出的边缘

二,固定位置画圆

'''
此方法是一种简单的在固定位置上画圆的方法, 动态自适应画圆请参考:get_adaptive_circle.py
使用方法:
im_floodfill = get_circle(crop_img)
输入原图crop_img
返回mask默认圆心坐标:
center_row, center_col = int(row // 2), int(col // 2)
默认半径:
radius = int(row // 2 - 10)
'''import cv2
import numpy as npdef fillHole(im_in):im_floodfill = im_in.copy()im_floodfill = np.uint8(im_floodfill)row, col, dim = im_floodfill.shape# Mask used to flood filling# Notice the size needs to be 2 pixels than the imagemask = np.zeros((row+2, col+2), np.uint8)# Floodfill from point int(row/2), int(col/2)cv2.floodFill(im_floodfill, mask, (int(row/2), int(col/2)), (255, 255,255))# cv2.morphologyEx(im_floodfill, cv2.MORPH_ELLIPSE, mask)return im_floodfilldef get_circle(crop_img):row, col, dim = crop_img.shapecenter_row, center_col = int(row // 2), int(col // 2)radius = int(row // 2 - 10)ellipse = np.zeros((row, col, dim))cv2.circle(ellipse, (center_row, center_col), radius, (255, 255, 255), 2)im_floodfill = fillHole(ellipse)cv2.imshow("ellipse", ellipse)cv2.imshow("crop_img", crop_img)cv2.imshow("im_floodfill", im_floodfill)cv2.waitKey(0)return im_floodfillif __name__ == '__main__':img = cv2.imread("/home/pi/1.png")crop_img = img[650:1400, 1000:1750]im_floodfill = get_circle(crop_img)# save_img_path = os.path.join(save_path, imgs_list[i])# cv2.imwrite(save_img_path, im_floodfill)

python 找图像中的圆相关推荐

  1. 使用Python,OpenCV和Hough圆检测图像中的圆

    使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...

  2. 使用OpenCV和Python从图像中提取形状

    Welcome to the first post in this series of blogs on extracting features from images using OpenCV an ...

  3. 编程实战(4)——python识别图像中的坐标点并保存坐标数据

    编程实战(4)--python识别图像中的坐标点并保存坐标数据 文章目录 编程实战(4)--python识别图像中的坐标点并保存坐标数据 综述 代码思路 库的安装 图片预处理 图像细化 图像二极化 提 ...

  4. python识别图像中绿色的部分_[OpenCV-Python] OpenCV 中的图像处理 部分 IV (四)

    部分 IV OpenCV 中的图像处理 21 OpenCV 中的轮廓 21.1 初识轮廓 目标 • 理解什么是轮廓 • 学习找轮廓,绘制轮廓等 • 函数:cv2.findContours(),cv2. ...

  5. 如何使用 Python 隐藏图像中的数据

    作者 | 小白 来源 | 小白学视觉 隐写术是在任何文件中隐藏秘密数据的艺术. 秘密数据可以是任何格式的数据,如文本甚至文件.简而言之,隐写术的主要目的是隐藏任何文件(通常是图像.音频或视频)中的预期 ...

  6. 基于Python查找图像中最常见的颜色

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决 ...

  7. python图像检测_如何用Python检测图像中的矩形项

    我发现了很多关于使用openCV等人在图像中找到"东西"的问题.在 Python中,但到目前为止,我一直无法将它们拼凑在一起,以便为我的问题提供可靠的解决方案. 我正在尝试使用计算 ...

  8. python识别图像中的物体_OpenCV+Python 指定物体识别

    本文介绍一种基于HoG+Pyramids+Sliding Windows+SVM的物体识别方法 基本流程 (1)确定最小检测物体,对原图img缩放,缩放比例为(滑动窗大小/最小物体大小). (2)缩放 ...

  9. python提取图片中的表格,Python从图像中的表中提取值

    我要从PDF表格中提取值,然后将数据保存在json文件中, 我使用pytesseract从将pdf转换为的图像中获取文本, 现在的问题是,它给了我一个包含所有数据的大字符串. 我尝试通过SP进行拆分, ...

最新文章

  1. 链表的建立,搜索,插入,反转,销毁以及合并有序链表。
  2. 外部引用CSS中 link与@import的区别
  3. 富贵不压重发_为什么老人常说“贵人不顶重发”,“重发”是什么意思? ?...
  4. 运维祈求不宕机_[国庆特辑] 程序员应该求谁保佑才能保证不宕机?
  5. Flink 最佳学习实践 | 从 0 到 1 学会 Apache Flink
  6. Oracle常用诊断事件清单
  7. Elasticsearch 最佳实践!
  8. 让线程等待10秒_Java多线程-线程状态
  9. 《网络对抗》 逆向及Bof基础实践
  10. g40-45支持虚拟化技术_虚拟化技术与原理简介
  11. python汉化包放哪_python 汉化
  12. ContentRoot 和 WebRoot 的区别
  13. PowerDesigner工具栏消失恢复
  14. 写会议纪要也是需要水平滴
  15. SpringCloud 基础架构搭建
  16. VS2017-C++-使用CSpreadSheet写EXCEL
  17. 高级查询组件dynamicCondition升级为v2.0.0版本(一)——使用步骤
  18. 分布式(技术栈、关键技术、PaaS平台、资料推荐、相关论文)
  19. python 获取当前运行的DCC工具
  20. Tomat组件研究之ThreadPool

热门文章

  1. Python—tkinter实现勾选框以及全选和反选
  2. adobe动画_Adobe替代品:动画软件
  3. mysql 遍历XML_mybatis 中,mapper.xml中遍历list集合知识点
  4. html 图片自动大小,css图片自适应_用css让图片自动适应大小
  5. 遍历各盘符,搜索是否安装某软件exe(某文件是否存在)
  6. openlayers3实现动态图标gif其他css支持的格式
  7. 注意力机制之注意力分数
  8. 成功管理计划(Managing Successful Programmes, MSP)
  9. RK3568-商显广告机、POS机主板方案
  10. 关于51单片机keil编程时头文件的引用