Python : RGB에서 YDbDr 색상 공간으로 이미지 변환

Nov 18 2020

다음 공식에 따라 이미지를 RGB 색상 공간에서 YDbDr 색상 공간으로 변환하려고합니다.

Y = 0.299R + 0.587G + 0.114B

Db = -0.45R - 0.883G +1.333B

Dr = -1.333R + 1.116G + 0.217B

다음 코드를 사용하여 회색조 이미지 여야하는 Y 채널 만 표시하려고하지만 이미지가 모두 파란색으로 계속 표시됩니다.

import numpy as np
from PIL import Image
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./pics/Slike_modela/Test/Proba/1_Color.png")
new_img = []
for row in img:
    new_row = []
    for pixel in row:
        Y = 0.299*pixel[2]+0.587*pixel[1]+0.114*pixel[0]
        Db = -0.45*pixel[2]-0.883*pixel[1]+1.333*pixel[0]
        Dr = -1.333*pixel[2]+1.116*pixel[1]+0.217*pixel[0]
        new_pixel = [Y, Db, Dr]
        new_row.append(new_pixel)
    new_img.append(new_row)

new_img_arr = np.array(new_img)
new_img_arr_y = new_img_arr.copy()
new_img_arr_y[:,:,1] = 0
new_img_arr_y[:,:,2] = 0
print (new_img_arr_y)
cv2.imshow("y image", new_img_arr_y) 
key = cv2.waitKey(0)

결과 배열을 인쇄 할 때 수식에 따라 올바른 숫자와 배열의 올바른 모양을 볼 수 있습니다.

내 실수는 무엇입니까? Y 채널 이미지, 즉 회색조 이미지를 얻는 방법은 무엇입니까?

답변

1 MarkSetchell Nov 22 2020 at 13:19

Python으로 이미지를 처리 ​​할 때 실제로 다음을 피해야합니다.

  • 이미지를 목록으로 처리하고 수백만 및 수백만 픽셀을 추가합니다. 각 픽셀은 완전히 새로운 개체를 만들고 관리하는 데 공간이 필요합니다.

  • for매우 느린 루프로 이미지 처리

이 두 가지를 모두 처리하는 더 좋은 방법은 Numpy또는 기타 벡터화 된 코드 라이브러리 또는 기술을 사용하는 것입니다. 그 이유 OpenCV의 , wand, scikit-imageNumPy와 배열 오픈 및 핸들 이미지.

따라서 기본적으로 3 가지 가중치 세트로 색상 채널의 내적을 수행하려고합니다.

import cv2
import numpy as np

# Load image
im = cv2.imread('paddington.png', cv2.IMREAD_COLOR)

# Calculate Y using Numpy "dot()"
Y = np.dot(im[...,:3], [0.114, 0.587, 0.299]).astype(np.uint8)

그게 다야.