opencv python截取圓形區(qū)域的實(shí)現(xiàn)
一、先進(jìn)行剪切操作
圓形區(qū)域占圖片可能不多,多余的部分不要。
看下圖。
只要紐扣電池內(nèi)部和少許的邊緣部分,其余黑色背景部分不需要。
先沿著紐扣電池的邊緣剪切出來感興趣的區(qū)域。
有2個(gè)方法,用尋找輪廓外接圓的方法,或者基爾霍夫圓的方法。
在這里以輪廓外接圓方法為例。
代碼如下:
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)# 灰度圖 # 二值化 這個(gè)位置要注意二值化和反二值化,看你原圖是什么樣子的底色 # 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=[] # 用來保存所有輪廓返回的坐標(biāo)點(diǎn)。 for c in contours: # 找到邊界坐標(biāo) min_list=[] # 保存單個(gè)輪廓的信息,x,y,w,h,area。 x,y 為起始點(diǎn)坐標(biāo) x, y, w, h = cv2.boundingRect(c) # 計(jì)算點(diǎn)集最外面的矩形邊界 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] # 把第一個(gè)矩形面積當(dāng)作最大矩形面積 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 # 在原圖上畫出最大的矩形 這部分實(shí)際上是對(duì)邊緣再擴(kuò)展一下,避免剪切的圓不夠完整 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()
代碼執(zhí)行以后可以看下剪切效果。大致如下。
以上代碼是單張圖片。
執(zhí)行一下代碼可以批量處理圖片。
注意:如果你的代碼報(bào)錯(cuò),注意下二值化的這行代碼,是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=[] # 用來保存所有輪廓返回的坐標(biāo)點(diǎn)。 for c in contours: # 找到邊界坐標(biāo) min_list=[] # 保存單個(gè)輪廓的信息,x,y,w,h,area。 x,y 為起始點(diǎn)坐標(biāo) x, y, w, h = cv2.boundingRect(c) # 計(jì)算點(diǎn)集最外面的矩形邊界 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] # 把第一個(gè)矩形面積當(dāng)作最大矩形面積 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)
批量以后效果類似下圖。基本上裁減掉了不需要的部分。
二、去除背景
執(zhí)行以下代碼。
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)
效果如下:
不要的部分就變成白色了
總結(jié)
卷積神經(jīng)網(wǎng)絡(luò)的不一定需要圖片預(yù)處理,有時(shí)候預(yù)處理反而得到不好的結(jié)果。但是也可以嘗試一下,也許結(jié)果更好。
到此這篇關(guān)于opencv python截取圓形區(qū)域的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)opencv 截取圓形區(qū)域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python簡(jiǎn)單實(shí)現(xiàn)基數(shù)排序算法
這篇文章主要介紹了python簡(jiǎn)單實(shí)現(xiàn)基數(shù)排序算法,僅用4行代碼即可實(shí)現(xiàn)基數(shù)排序算法,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-05-05python實(shí)現(xiàn)百度文庫自動(dòng)化爬取
項(xiàng)目是合法項(xiàng)目,只是進(jìn)行數(shù)據(jù)解析而已,不能下載看不到的內(nèi)容.部分文檔在電腦端不能預(yù)覽,但是在手機(jī)端可以預(yù)覽,所有本項(xiàng)目把瀏覽器瀏覽格式改成手機(jī)端,支持Windows和Ubuntu. 本項(xiàng)目使用的是chromedriver來控制chrome來模擬人來操作來進(jìn)行文檔爬取2021-04-04Pytorch中.detach()與.data的用法小結(jié)
這篇文章主要介紹了Pytorch中.detach()與.data的用法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Python開發(fā)之迭代器&生成器的實(shí)戰(zhàn)案例分享
在 Python 中,迭代器和生成器都是用來遍歷數(shù)據(jù)集合的工具,可以按需逐個(gè)生成或返回?cái)?shù)據(jù),從而避免一次性加載整個(gè)數(shù)據(jù)集合所帶來的性能問題和內(nèi)存消耗問題。本文主要和大家分享幾個(gè)貼近實(shí)際運(yùn)維開發(fā)工作中的場(chǎng)景案例,希望對(duì)大家有所幫助2023-04-04python 動(dòng)態(tài)遷移solr數(shù)據(jù)過程解析
這篇文章主要介紹了python 動(dòng)態(tài)遷移solr數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Python兩臺(tái)電腦實(shí)現(xiàn)TCP通信的方法示例
這篇文章主要介紹了Python兩臺(tái)電腦實(shí)現(xiàn)TCP通信的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python tkinter實(shí)現(xiàn)簡(jiǎn)單加法計(jì)算器代碼實(shí)例
這篇文章主要介紹了Python tkinter實(shí)現(xiàn)簡(jiǎn)單加法計(jì)算器代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05