opencv python截取圆形区域的实现

作者:粒子白 时间:2022-11-27 06:58:50 

一、先进行剪切操作

圆形区域占图片可能不多,多余的部分不要。
看下图。

opencv python截取圆形区域的实现

只要纽扣电池内部和少许的边缘部分,其余黑色背景部分不需要。
先沿着纽扣电池的边缘剪切出来感兴趣的区域。
有2个方法,用寻找轮廓外接圆的方法,或者基尔霍夫圆的方法。
在这里以轮廓外接圆方法为例。
代码如下:

import cv2
import numpy as np

image = cv2.imread('F:\Siamese-pytorch-master\datasets\images_background\quebian_Hander/20220724-112303-336.jpg')
image=cv2.resize(image,(800,600))#缩放一下
img=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 灰度图
# 二值化  这个位置要注意二值化和反二值化,看你原图是什么样子的底色
# ret , thresh = cv2.threshold(img, 230, 255, cv2.THRESH_BINARY_INV)
# ret , thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
ret , thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
dot=[]  # 用来保存所有轮廓返回的坐标点。
for c in contours:
   # 找到边界坐标
   min_list=[] # 保存单个轮廓的信息,x,y,w,h,area。 x,y 为起始点坐标
   x, y, w, h = cv2.boundingRect(c)  # 计算点集最外面的矩形边界
   min_list.append(x)
   min_list.append(y)
   min_list.append(w)
   min_list.append(h)
   min_list.append(w*h) # 把轮廓面积也添加到 dot 中
   dot.append(min_list)

# 找出最大矩形的 x,y,w,h,area
max_area=dot[0][4] # 把第一个矩形面积当作最大矩形面积
for inlist in dot:
   area=inlist[4]
   if area >= max_area:
       x=inlist[0]
       y=inlist[1]
       w=inlist[2]
       h=inlist[3]
       max_area=area
# 在原图上画出最大的矩形  这部分实际上是对边缘再扩展一下,避免剪切的圆不够完整
print(x,y,w,h)
if y>=60:
   new_w=60
elif y>=50:
   new_w=50
elif y>=40:
   new_w=40
elif y>=30:
   new_w=30
elif y>=20:
   new_w=20
elif y>=10:
   new_w=10

x0=x-int(new_w/2)
y0=y-int(new_w/2)
w=w+new_w
h=h+new_w
print(x0,y0,w,h)
# cv2.rectangle(image, (x0, y0), (x + w, y + h), (0, 255, 0), 1)

crop = image[y0:y0+h, x0:x0+w]
cv2.imshow('crop',crop)
cv2.imwrite("crop.jpg",crop)
cv2.waitKey(0)
cv2.destroyWindow()

代码执行以后可以看下剪切效果。大致如下。

opencv python截取圆形区域的实现

以上代码是单张图片。
执行一下代码可以批量处理图片。
注意:如果你的代码报错,注意下二值化的这行代码,是THRESH_BINARY_INV还是THRESH_BINARY。

# -*- coding:utf-8 -*-
# from re import X
import cv2
import numpy as np

from glob import glob
import os

img_path = glob("F:\Siamese-pytorch-master\datasets\images_background\character01/*.jpg")
path_save = "F:\Siamese-pytorch-master\datasets\images_background\quebian_Hander/"

for i,file in enumerate(img_path):
   name = os.path.join(path_save, "%d.jpg"%i)
   image = cv2.imread(file)
   print(file,i)
   image=cv2.resize(image,(800,600))
   img=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
   img = cv2.bilateralFilter(img,9,75,75)
   ret , thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
   contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

dot=[]  # 用来保存所有轮廓返回的坐标点。
   for c in contours:
       # 找到边界坐标
       min_list=[] # 保存单个轮廓的信息,x,y,w,h,area。 x,y 为起始点坐标
       x, y, w, h = cv2.boundingRect(c)  # 计算点集最外面的矩形边界
       min_list.append(x)
       min_list.append(y)
       min_list.append(w)
       min_list.append(h)
       min_list.append(w*h) # 把轮廓面积也添加到 dot 中
       dot.append(min_list)

# 找出最大矩形的 x,y,w,h,area
   max_area=dot[0][4] # 把第一个矩形面积当作最大矩形面积
   for inlist in dot:
       area=inlist[4]
       if area >= max_area:
           x=inlist[0]
           y=inlist[1]
           w=inlist[2]
           h=inlist[3]
           max_area=area
# 在原图上画出最大的矩形
   print(x,y,w,h)
   if y>=60:
       new_w=60
   elif y>=50:
       new_w=50
   elif y>=40:
       new_w=40
   elif y>=30:
       new_w=30
   elif y>=20:
       new_w=20
   elif y>=10:
       new_w=10
   elif y>=5:
       new_w=5
   else:
       new_w=0

x0=x-int(new_w/2)
   y0=y-int(new_w/2)
   w=w+new_w
   h=h+new_w
   print(x0,y0,w,h)
   # cv2.rectangle(image, (x0, y0), (x0 + w , y0 + h), (0, 255, 0), 1)
   crop = image[y0:y0+h, x0:x0+w]
   cv2.imwrite(name,crop)

批量以后效果类似下图。基本上裁减掉了不需要的部分。

opencv python截取圆形区域的实现

二、去除背景

执行以下代码。

import cv2
import numpy as np
from glob import glob
import os

img_path = glob("F:\DEMO_CODE\demo\ML\qieyuan/*.jpg")
path_save = "F:\DEMO_CODE\demo\ML\qieyuan/"

for i,file in enumerate(img_path):
   name = os.path.join(path_save, "%d.jpg"%i)
   image = cv2.imread(file)
   gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
   _, binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
   contours, _ = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
   for cont in contours:
       (x, y), radius = cv2.minEnclosingCircle(cont)
       if radius>200:
           ming=cv2.circle(image,(int(x),int(y)),int(radius), (0, 0, 255), 2)
           print("radius is ")
           print(radius)
           print((x, y))  
           roi = np.zeros(image.shape[:2], np.uint8)
           roi = cv2.circle(roi,(int(x),int(y)), int(radius), 255, cv2.FILLED)
           mask = np.ones_like(image) * 255
           mask = cv2.bitwise_and(mask, image, mask=roi) + cv2.bitwise_and(mask, mask, mask=~roi)
           cv2.imwrite(name,mask)
           print(i,name)

效果如下:

opencv python截取圆形区域的实现

不要的部分就变成白色了

来源:https://blog.csdn.net/linmuquan1989/article/details/126315114

标签:opencv,截取圆形
0
投稿

猜你喜欢

  • ASP环境中使用QQ纯真版IP数据库QQWry.dat

    2010-02-26 13:35:00
  • 关于MySql 10038错误的完美解决方法(三种)

    2024-01-27 06:16:18
  • Pycharm添加虚拟解释器报错问题解决方案

    2022-05-28 04:07:53
  • Python 编程速成(推荐)

    2021-04-03 04:30:10
  • 经验总结:ASP与存储过程解析

    2008-11-07 13:33:00
  • python3.7中安装paddleocr及paddlepaddle包的多种方法

    2022-08-11 00:00:57
  • Perl 哈希Hash用法之入门教程

    2023-11-06 22:57:17
  • 在SQL Server 2005所有表中搜索某个指定列的方法

    2024-01-21 22:50:25
  • 如何利用Image Data Type在主页中显示图形?

    2010-01-01 15:13:00
  • Mysql Innodb 引擎优化

    2010-10-25 20:01:00
  • Pycharm2022最新版无法换源解决方法

    2023-02-09 20:51:55
  • Flask 数据库集成的介绍

    2023-07-15 09:28:20
  • python解析xml文件实例分享

    2021-11-20 07:56:14
  • c#编写的高并发数据库控制访问代码

    2024-01-16 04:57:04
  • 基于Python实现简单的汉字拼音转换工具

    2022-10-03 10:42:35
  • 浅谈Python的正则表达式

    2022-05-11 00:54:16
  • 在 Golang 中实现一个简单的Http中间件过程详解

    2024-05-09 14:55:35
  • 浅谈Go语言中的结构体struct & 接口Interface & 反射

    2024-05-22 10:30:50
  • SWFObject 2.1以上版本语法介绍

    2024-04-10 10:49:18
  • echarts柱状图坐标轴内容显示不全的两种解决办法

    2023-09-06 03:57:34
  • asp之家 网络编程 m.aspxhome.com