2023-03-14

[OpenCV] 以最亮顏色的色相來進行灰階處理

OpenCV-Python 教學 https://docs.opencv.org/3.4.16/d6/d00/tutorial_py_root.html

原始圖片

原圖因為燈光散射的關係,整個圖片都出現發紅的現象


預設灰階 cv2.imread('01.jpg', cv2.IMREAD_GRAYSCALE)

有部分的色差變得不明顯,之後要進行辨識變得很困難


色相比例的灰階

透過色相的方式就好很多


HSV 的數值定義

  • H: 色相 0~360度
  • S: 飽和度 0~1
  • V: 明度 (黑)0~1(白)

OpenCV HSV 的數值定義

  • H: 0 ~ 180 => H / 2
  • S: 0 ~ 255 => S * 255
  • V: 0 ~ 255 => V * 255

相依套件:

pip install opencv-python
pip install py-linq     # https://viralogic.github.io/py-enumerable/

程式:

from py_linq import Enumerable
import cv2
import numpy as np


def get_hue(img):
    ''' 圖片色相 '''

    img = cv2.resize(img, (32, 32), interpolation = cv2.INTER_LINEAR)
    img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    pixel_hsv = np.reshape(img_hsv,(-1,3))

    result = Enumerable(pixel_hsv)\
        .order_by_descending(lambda p: p[2])\
        .then_by_descending(lambda p: p[1])\
        .first()

    print(f'[result]: {result}')
    return result[0]



def get_gray_rate(hue):
    ''' 根據色相計算灰階比例 '''

    hue_full = np.uint8([[[hue,255,255]]])
    hue_bgr = cv2.cvtColor(hue_full, cv2.COLOR_HSV2BGR)
    (hue_b, hue_g, hue_r) = hue_bgr[0,0]

    hue_total =  0.0 + hue_b + hue_g + hue_r

    return [
        hue_b / hue_total,
        hue_g / hue_total,
        hue_r / hue_total,
    ]



img = cv2.imread('01.jpg')

hue = get_hue(img)
gray_rate = get_gray_rate(hue) # 灰階比例

print(f'hue:{hue}, gray_rate: {gray_rate}')

# 灰階轉換
img_gray = cv2.transform(img, np.array([gray_rate]))

cv2.imshow("img", img)
cv2.imshow("img_gray", img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

沒有留言:

張貼留言

你好!歡迎你在我的 Blog 上留下你寶貴的意見。