1. 程式人生 > >OpenCV—Python目標區域影象分割

OpenCV—Python目標區域影象分割

使用OpenCV擷取目標區域

#encoding:utf-8
import cv2
import numpy as np


def get_image(path):       #獲取圖片
    img=cv2.imread(path)
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    return img, gray

def Gaussian_Blur(gray):    # 高斯去噪(去除影象中的噪點)
	"""
	高斯模糊本質上是低通濾波器:
	輸出影象的每個畫素點是原影象上對應畫素點與周圍畫素點的加權和
	
	高斯矩陣的尺寸和標準差:
	(9, 9)表示高斯矩陣的長與寬,標準差取0時OpenCV會根據高斯矩陣的尺寸自己計算。
	高斯矩陣的尺寸越大,標準差越大,處理過的影象模糊程度越大。
	"""
blurred = cv2.GaussianBlur(gray, (9, 9),0) return blurred def Sobel_gradient(blurred): """ 索比爾運算元來計算x、y方向梯度 關於運算元請檢視:https://blog.csdn.net/wsp_1138886114/article/details/81368890 """ gradX = cv2.Sobel(blurred, ddepth=cv2.CV_32F, dx=1, dy=0) gradY = cv2.Sobel(blurred, ddepth=cv2.CV_32F,
dx=0, dy=1) gradient = cv2.subtract(gradX, gradY) gradient = cv2.convertScaleAbs(gradient) return gradX, gradY, gradient def Thresh_and_blur(gradient): #設定閾值 blurred = cv2.GaussianBlur(gradient, (9, 9),0) (_, thresh) = cv2.threshold(blurred, 90, 255, cv2.THRESH_BINARY) """ cv2.threshold(src,thresh,maxval,type[,dst])->retval,dst (二元值的灰度圖) src: 一般輸入灰度圖 thresh:閾值, maxval:在二元閾值THRESH_BINARY和 逆二元閾值THRESH_BINARY_INV中使用的最大值 type: 使用的閾值型別 返回值 retval其實就是閾值 """
return thresh def image_morphology(thresh): """ 建立一個橢圓核函式 執行影象形態學, 細節直接查文件,很簡單 """ kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25)) closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) closed = cv2.erode(closed, None, iterations=4) closed = cv2.dilate(closed, None, iterations=4) return closed def findcnts_and_box_point(closed): # 這裡opencv3返回的是三個引數 (_, cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) c = sorted(cnts, key=cv2.contourArea, reverse=True)[0] # 計算最大輪廓的旋轉包圍盒 rect = cv2.minAreaRect(c) box = np.int0(cv2.boxPoints(rect)) return box def drawcnts_and_cut(original_img, box): #目標影象裁剪 # 因為這個函式有極強的破壞性,所有需要在img.copy()上畫 draw_img = cv2.drawContours(original_img.copy(), [box], -1, (0, 0, 255), 3) Xs = [i[0] for i in box] Ys = [i[1] for i in box] x1 = min(Xs) x2 = max(Xs) y1 = min(Ys) y2 = max(Ys) hight = y2 - y1 width = x2 - x1 crop_img = original_img[y1:y1+hight, x1:x1+width] return draw_img, crop_img def walk(): img_path = r'./2010.png' save_path = r'./cat_save.png' original_img, gray = get_image(img_path) blurred = Gaussian_Blur(gray) gradX, gradY, gradient = Sobel_gradient(blurred) thresh = Thresh_and_blur(gradient) closed = image_morphology(thresh) box = findcnts_and_box_point(closed) draw_img, crop_img = drawcnts_and_cut(original_img,box) # 暴力一點,把它們都顯示出來看看 cv2.imshow('original_img', original_img) cv2.imshow('GaussianBlur', blurred) cv2.imshow('gradX', gradX) cv2.imshow('gradY', gradY) cv2.imshow('final', gradient) cv2.imshow('thresh', thresh) cv2.imshow('closed', closed) cv2.imshow('draw_img', draw_img) cv2.imshow('crop_img', crop_img) cv2.waitKey(20171219) cv2.imwrite(save_path, crop_img) walk()

執行效果
在這裡插入圖片描述