OpenCV / Python でLAB色空間で2色間の距離を測るために、以下の手順をとりました。
Python
1import cv2 2import numpy as np 3import math 4from scipy import stats 5 6img = cv2.imread(filepath) 7mask_img = cv2.imread(filepath,0) #白255/黒0のマスク画像 8 9_, mask_img = cv2.threshold(mask_img, 160, 255, cv2.THRESH_BINARY) 10img[mask_img==0] = (0,0,0) 11 12img = cv2.cvtColor(img,cv2.COLOR_BGR2LAB) 13 14#マスクで切り抜いた画像から最も多い色を選ぶ 15cropped_img = img[mask==0].reshape(-1,3) 16cropped_img = cropped_img[~np.all(cropped_img==[0,128,128], axis=-1)] 17#この段階で何故か黒=[0,128,128]となっている 18mode_color = stats.mode(cropped_img)[0].squeeze() 19 20L, A, B= mode_color 21 22L1, A1, B1 = img[x,y] 23c_diff = math.sqrt((L - L1)**2 + (A - A1)**2 + (B - B1)**2) #色差
まず、LABに変換した直後の配列を確認すると、黒が[0,128,128]となっています。
調べてみると画像変換の際に、img.astype(np.float32)とすると[0,0,0]で読み込まれるようで、実際にそうなりましたが、原因がよく分かりません。
公式ではLAB = 0~255,..,..となっているようですが。
https://stackoverflow.com/questions/63269882/color-space-transformation-in-opencv-rgb-lab-red-does-not-produce-expecte
ただ、floatに変換した後に、再度LAB2BGRを行うと、画像が青一色に所々ノイズが入ったような状態になってしまいました。
画像をfloatで扱ったことがないので、float変換後にマスク切り抜き→多い色の検出が正常に行われているのかさえもよく分かりません。
私のコードの書き方に問題があるのか、それともLABへの変換は自前で用意した方が良いのか、何か助言を頂けると幸いです。
宜しくお願いいたします。
