我的编程空间,编程开发者的网络收藏夹
学习永远不晚

opencvpython截取圆形区域的实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

opencvpython截取圆形区域的实现

一、先进行剪切操作

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

只要纽扣电池内部和少许的边缘部分,其余黑色背景部分不需要。
先沿着纽扣电池的边缘剪切出来感兴趣的区域。
有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()

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

以上代码是单张图片。
执行一下代码可以批量处理图片。
注意:如果你的代码报错,注意下二值化的这行代码,是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)


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

二、去除背景

执行以下代码。

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截取圆形区域的实现的文章就介绍到这了,更多相关opencv 截取圆形区域内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

opencvpython截取圆形区域的实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android矩形区域内实现截图

要在Android设备上实现矩形区域的截图,可以使用以下步骤:1. 创建一个用于显示截图的`ImageView`组件,并将其添加到布局文件中。2. 在需要进行截图的地方,添加一个触摸事件监听器,以便用户可以选择矩形区域。在触摸事件监听器中,
2023-08-23

C#如何实现opencv截取旋转矩形区域图像

本篇内容主要讲解“C#如何实现opencv截取旋转矩形区域图像”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现opencv截取旋转矩形区域图像”吧!前言:最近在工程中需要用到截取Rot
2023-06-07

android矩形区域内如何实现截图

在Android中,可以使用以下代码实现在矩形区域内进行截图:1. 首先,我们需要获取屏幕的截图,可以通过以下代码获取整个屏幕的截图:```javaBitmap screenShot = takeScreenshot();```2. 然后,
2023-08-24

Android实现bitmap指定区域滑动截取功能

突然不知道什么心态,说要做这个,网上找了半天没找到合适的,就自己做了一个。 先上效果图: 透明区域为将要截取的区域,其他阴影部位为舍弃区域 图片资源我写死储存在了raw中,有需要可以自己写获取bitmap。 界面layout:
2023-05-30

.NET SkiaSharp 生成二维码验证码及指定区域截取方法实现

这篇文章主要为大家介绍了.NET SkiaSharp 生成二维码验证码及指定区域截取方法实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

QT编写地图实现获取区域边界的方法是什么

本篇内容介绍了“QT编写地图实现获取区域边界的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言区域边界也是一些坐标点集合,而
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录