1. 程式人生 > >基於HSV顏色的連通區域提取

基於HSV顏色的連通區域提取

基於HSV顏色的ROI區域提取

過程:

  1. 得到影象中想要提取ROI的HSV範圍
  2. 通過HSV範圍得到二值影象,在範圍內的值變為255,不在的是0
  3. 在二值影象中找連通區域,即ROI

程式碼

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from skimage import measure
import matplotlib.pyplot as plt

def hsv_mask(image, lower_color, upper_color, kernel_size):
    lower = np.array(lower_color, np.uint8)
    upper = np.array(upper_color, np.uint8)
    # 得到二值影象,在lower~upper範圍內的值為255,不在的值為0
mask = cv2.inRange(image, lower, upper) # 進行腐蝕和膨脹 if kernel_size: kernel=cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size) dilated = cv2.dilate(mask, kernel) eroded = cv2.erode(dilated, kernel) return eroded else: return mask if __name__ == '__main__'
: im= cv2.imread('book.jpg') # 模糊,消除噪聲 blur_image = cv2.GaussianBlur(im, (5, 5), 0) # 轉換HSV顏色空間 hsv_image = cv2.cvtColor(blur_image, cv2.COLOR_BGR2HSV) # 藍色區域的HSV值範圍 hsv_low = [105, 80, 80] hsv_high = [125, 180, 140] # 通過設定的範圍,去除不要的區域 kernel_size = (20,20) img = hsv_mask(hsv_image, hsv_low, hsv_high, kernel_size) # 找連通域
labels = measure.label(img, connectivity=2) pro = measure.regionprops(labels) # 畫矩形框 fig, ax = plt.subplots() im = im[:, :, (2, 1, 0)] ax.imshow(im, aspect='equal') for region in pro: box = region.bbox ax.add_patch( plt.Rectangle((box[1], box[0]), box[3] - box[1], box[2] - box[0], fill=False, edgecolor='red', linewidth=2) ) # 去除座標 plt.axis('off') #dpi是設定清晰度的,大於300就很清晰了 plt.savefig('result.png', dpi=300)

這裡寫圖片描述
這裡寫圖片描述
注意:

  1. ax,plt畫圖的x對應影象中的列數,y對應的是行數
  2. 用plt畫圖,顯示和儲存下來的圖片,四周是有邊框的,是可以去掉的
  3. 找連通域
labels = measure.label(img, connectivity=2)
pro = measure.regionprops(labels)

connectivity=2表示8鄰接,1是4鄰接。pro是list型別,每個region有很多屬性,需要可以自己去查。
例如:bbox是邊界外接框,area是區域內的畫素個數,centroid是區域中心座標等等,可以通過這些屬性過濾掉一些區域。