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()

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

以上代码是单张图片。
执行一下代码可以批量处理图片。
注意:如果你的代码报错,注意下二值化的这行代码,是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 截取圆形区域内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#使用opencv截取旋转矩形区域图像的实现示例

    前言:最近在工程中需要用到截取RotatedRect中的图形,保存为Mat做后续处理.发现opencv文档中没有这个api,最开始想到的方案是将整张图片进行相应的旋转,然后再从中截取正矩形,但是我们要获取的是部分区域,将整张图片进行旋转会造成很多的资源浪费.所以需要自行实现一个旋转矩形的方案. 实现方法 原理是利用向量空间变换,如图 通过 Point2f[] points=rotatedRect.Points(); 可获取RotatedRect四个端点的坐标.先选定一个点为输出Mat左上端点,这

  • python用opencv批量截取图像指定区域的方法

    代码如下 import os import cv2 for i in range(1,201): if i==169 or i==189: i = i+1 pth = "C:\\Users\\Desktop\\asd\\"+str(i)+".bmp" image = cv2.imread(pth) //从指定路径读取图像 cropImg = image[600:1200,750:1500] //获取感兴趣区域 cv2.imwrite("C:\\Users\

  • OpenCV鼠标绘制矩形和截取矩形区域图像

    本文实例为大家分享了OpenCV鼠标绘制截取矩形区域图像的具体代码,供大家参考,具体内容如下 在opencv中利用鼠标绘制矩形,代码如下: #include <cv.h> #include <highgui.h> #include <stdio.h> #pragma comment( lib, "cv.lib" ) #pragma comment( lib, "cxcore.lib" ) #pragma comment( lib,

  • python3+opencv3识别图片中的物体并截取的方法

    如下所示: 运行环境:python3.6.4 opencv3.4.0 # -*- coding:utf-8 -*- """ Note: 使用Python和OpenCV检测图像中的物体并将物体裁剪下来 """ import cv2 import numpy as np # step1:加载图片,转成灰度图 image = cv2.imread("353.jpg") gray = cv2.cvtColor(image, cv2.C

  • python使用opencv按一定间隔截取视频帧

    关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高层 API .它不依赖于其它的外部库 -- 尽管也可以使用某些外部库. OpenCV 对非商业应用和商业应用都是免费 的.同时 OpenCV 提供了对硬件的访问,可以直接访问摄像头,并且 opencv 还提供了一个简单的 GUI(graph

  • python+openCV对视频进行截取的实现

    使用cv2对视频进行切割 import cv2 def clip_video(source_video, target_video, start_time, end_time): cap = cv2.VideoCapture(source_video) if not cap.isOpened(): logger_warning('video is not opened') else: success, frame = cap.read() f_shape = frame.shape f_heig

  • Python OpenCV视频截取并保存实现代码

    这篇文章主要介绍了Python OpenCV视频截取并保存实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在图像处理之前,我们需要对拿到手的数据进行筛选,对于视频,我们需要从中截取我们需要的一段或几段 整体思路比较简单,通过设定截取视频的起止时间(帧数),可以将该时间段内的图像保存为新的视频 直接上代码 """ [函数名称] 截取视频 [参数] 输入参数 视频文件名称 [详细介绍] 输入不同时间段 进行截取拼接 [创

  • 详解Python+opencv裁剪/截取图片的几种方式

    前言 在计算机视觉任务中,如图像分类,图像数据集必不可少.自己采集的图片往往存在很多噪声或无用信息会影响模型训练.因此,需要对图片进行裁剪处理,以防止图片边缘无用信息对模型造成影响.本文介绍几种图片裁剪的方式,供大家参考. 一.手动单张裁剪/截取 selectROI:选择感兴趣区域,边界框框选x,y,w,h selectROI(windowName, img, showCrosshair=None, fromCenter=None): . 参数windowName:选择的区域被显示在的窗口的名字

  • opencv python截取圆形区域的实现

    目录 一.先进行剪切操作 二.去除背景 总结 一.先进行剪切操作 圆形区域占图片可能不多,多余的部分不要.看下图. 只要纽扣电池内部和少许的边缘部分,其余黑色背景部分不需要.先沿着纽扣电池的边缘剪切出来感兴趣的区域.有2个方法,用寻找轮廓外接圆的方法,或者基尔霍夫圆的方法.在这里以轮廓外接圆方法为例.代码如下: import cv2 import numpy as np image = cv2.imread('F:\Siamese-pytorch-master\datasets\images_b

  • Python+OpenCV实现单个圆形孔和针检测

    如果中间红色区域是针则可以用下面的代码检测,其阈值和斑点检测的参数根据图像像素值做相应修改 检测的主要思路是先通过找到外面的大圆,再通过圆心定位出一个ROI区域,在ROI区域中检测中心的检测对象 import os import cv2 import numpy as np import math # 检测针脚位置 def needelCenter_detect(img): params = cv2.SimpleBlobDetector_Params() # Setup SimpleBlobDe

  • python自动截取需要区域,进行图像识别的方法

    实例如下所示: import os os.chdir("G:\Python1\Lib\site-packages\pytesser") from pytesser import * from pytesseract import image_to_string from PIL import Image from PIL import ImageGrab #截图,获取需要识别的区域 x = 345 y = 281 m = 462 n = 327 k = 54 for i in rang

  • python cv2截取不规则区域图片实例

    知识掌握 cv2.threshold()函数: 设置固定级别的阈值应用于多通道矩阵,将灰度图像变换二值图像,或去除指定级别的噪声,或过滤掉过小或者过大的像素点. Python: cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst 在其中: src:表示的是图片源 thresh:表示的是阈值(起始值) maxval:表示的是最大值 type:表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BIN

  • 如何基于OpenCV&Python实现霍夫变换圆形检测

    简述 基于python使用opencv实现在一张图片中检测出圆形,并且根据坐标和半径标记出圆.不涉及理论,只讲应用. 霍夫变换检测圆形的原理 其实检测圆形和检测直线的原理差别不大,只不过直线是在二维空间,因为y=kx+b,只有k和b两个自由度.而圆形的一般性方程表示为(x-a)²+(y-b)²=r².那么就有三个自由度圆心坐标a,b,和半径r.这就意味着需要更多的计算量,而OpenCV中提供的cvHoughCircle()函数里面可以设定半径r的取值范围,相当于有一个先验设定,在每一个r来说,在

  • python环境下OPenCV处理视频流局部区域像素值

    参考我之前写的处理图片的文章:Python+OpenCV实现[图片]局部区域像素值处理(改进版) 开发环境:Python3.6.0 + OpenCV3.2.0 任务目标:摄像头采集图像(例如:480640),并对视频流每一帧(灰度图)特定矩形区域(48030)像素值进行行求和,得到一个480*1的数组,用这480个数据绘制条形图,即在逐帧采集视频流并处理后"实时"显示采集到的视频,并"实时"更新条形图.工作流程如下图: 源码: # -*- coding:utf-8

随机推荐