import numpy as np import cv2 import scipy.stats as sstats import matplotlib.pyplot as plt def func1(luv): l, u, v = cv2.split(luv.astype(int)) mode_l = sstats.mode(l[l.nonzero()])[0][0] mode_u = sstats.mode(u[l.nonzero()])[0][0] mode_v = sstats.mode(v[l.nonzero()])[0][0] luv[(mode_u - u)**2 + (mode_v - v)**2 < 3000., :] = [0, 0, 0] return luv def func2(luv): l, u, v = cv2.split(luv) mode_l = sstats.mode(l[l.nonzero()])[0][0] mode_u = sstats.mode(u[l.nonzero()])[0][0] mode_v = sstats.mode(v[l.nonzero()])[0][0] mode = np.array([mode_l, mode_u, mode_v], dtype=int) a = (mode - luv)**2 b = a[:, :, 1] + a[:, :, 2] c = (b >= 3000).astype(int) cs = np.stack([c] * 3, axis=2) luv = luv * cs return luv bgr = cv2.imread('bara.jpg') luv = cv2.cvtColor(bgr, cv2.COLOR_BGR2Luv) luvs = func1(luv) result_s = cv2.cvtColor(luvs, cv2.COLOR_Luv2BGR) cv2.imwrite("result_s.jpg",result_s) rgb = result_s[:, :, [2, 1, 0]] plt.imshow(rgb) plt.show() luvk = func2(luv) result_k = cv2.cvtColor(luvk, cv2.COLOR_Luv2BGR) cv2.imwrite("result_k.jpg",result_k) rgb = result_k[:, :, [2, 1, 0]] plt.imshow(rgb) plt.show() ```黒(輝度Lが0)以外の背景色に近い色(最頻値からの色の距離が小さいもの)を黒く塗るプログラムを作成しました。RGBについては、昨日質問させていただいて、お二人のご助言により計算速度を向上できました。今度はCIELuv空間で試みたところ、一つの方法(result_s.jpg)ではうまくいくのですが、もう一つの方法ではエラーが出てうまくいきません。result_k.jpgがきちんと出力できるよう、ご教示いただけないでしょうか? 入力画像と、成功した結果result_s.jpgはそれぞれ下画像のとおりです。 ![入力画像はこれです。](90dc77d46b83fe5fb464cca373ffd2d8.jpeg) ![result_s.jpgはこれです。](46fc7a95adb46a1e4beedad029df935c.jpeg) エラーメッセージはこれです。 Traceback (most recent call last): File "kirisaki3.py", line 38, in <module> result_k = cv2.cvtColor(luvk, cv2.COLOR_Luv2BGR) cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/color.simd_helpers.hpp:94: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<3>; VDcn = cv::impl::{anonymous}::Set<3, 4>; VDepth = cv::impl::{anonymous}::Set<0, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = (cv::impl::<unnamed>::SizePolicy)2u; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]' > Unsupported depth of input image: > 'VDepth::contains(depth)' > where > 'depth' is 4 (CV_32S)
回答2件
あなたの回答
tips
プレビュー