檢測和分割目標影象例項
阿新 • • 發佈:2021-10-09
程式碼示例:
import cv2 as cv import numpy as np # 讀取圖片 img_path = r"D:\workplace\data\opencv\football.jpg" img = cv.imread(img_path) # 轉灰度 gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) # 對灰度圖,高斯去噪 blurred = cv.GaussianBlur(gray, (9, 9), 0) # todo: 如何去噪 cv.imshow('blurred_img', blurred) # 提取影象梯度,以sobel運算元,計算x,y方向上的梯度 grad_x = cv.Sobel(blurred, ddepth=cv.CV_32F, dx=1, dy=0) # 或者對blurred,gray grad_y = cv.Sobel(blurred, ddepth=cv.CV_32F, dx=0, dy=1) gradient = cv.subtract(grad_x, grad_y) gradient = cv.convertScaleAbs(gradient) cv.imshow('gradient_img', gradient) # 去噪 blurred = cv.GaussianBlur(gradient, (9,9),0) (_, thresh) = cv.threshold(blurred, 90,255,cv.THRESH_BINARY) # 影象形態學 # 建立一個橢圓函式 kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (25,25)) closed = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel) # 細節刻畫 closed = cv.erode(closed, None, iterations=4) closed = cv.dilate(closed, None, iterations=4) # 找出區域輪廓 (_,cnts, _) = cv.findContours(closed.copy(),cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 畫出輪廓 c = sorted(cnts, key=cv.contourArea, reverse=True)[0] rect = cv.minAreaRect(c) box = np.int0(cv.boxPoints(rect)) draw_img = cv.drawContours(img.copy(), [box], -1, (0,0,255), 3) # 剪切出對區域 xs = [i[0] for i in box] ys = [i[1] for i in box] x1 = abs(min(xs)) x2 = abs(max(xs)) y1 = abs(min(ys)) y2 = abs(max(ys)) height = y2 - y1 width = x2 - x1 crop_img = img[y1:y1+height, x1:x1+width] if __name__ == '__main__': # 顯示 # cv.imshow('origin_img', origin_img) # cv.imshow('blurred_img', blurred) # cv.imshow('grad_x_img', grad_x) # cv.imshow('grad_y_img', grad_y) # cv.imshow('gradient_img', gradient) # cv.imshow('thresh_img', thresh) # cv.imshow('closed_img', closed) cv.imshow('draw_img', draw_img) cv.imshow('select_img', crop_img) cv.waitKey(0) cv.destroyAllWindows()