1. 程式人生 > 其它 >檢測和分割目標影象例項

檢測和分割目標影象例項

程式碼示例:

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