Как я могу выбрать хорошие цвета на изображении с OpenCV и маской?

1

Я пытаюсь выбрать цвет на картинке. Я использую OpenCV для этого и учусь на странице https://realpython.com/python-opencv-color-spaces/. Изображение, которое я лечу, показывается сразу после этого.

import cv2
import matplotlib.pyplot as plt
import numpy as np

greenhsv = (60, 255, 255)
green2hsv=(70,100,170)
g_square = np.full((10, 10, 3), greenhsv, dtype=np.uint8)/255.0
plt.imshow(hsv_to_rgb(g_square))
plt.show()
g1_square = np.full((10, 10, 3), green2hsv, dtype=np.uint8)/255.0
plt.imshow(hsv_to_rgb(g1_square))
plt.show()

nucl = cv2.imread('./Pictures/image_nucleation_essai0.png')
nucl = cv2.cvtColor(nucl, cv2.COLOR_BGR2RGB)
plt.imshow(nucl)
plt.show()

hsv_nucl = cv2.cvtColor(nucl, cv2.COLOR_RGB2HSV)

mask = cv2.inRange(hsv_nucl, greenhsv,green2hsv)
result = cv2.bitwise_and(nucl, nucl, mask=mask)
plt.imshow(mask, cmap="gray")
plt.show()
plt.imshow(result)
plt.show()

Вот что я получаю:

Изображение 174551

Изображение 174551

Очевидно, маска не сделала свою работу... Я не понимаю, почему. Я играл со значениями зеленого, но ничего не получил...

Где моя ошибка?

  • 0
    почему вы используете HSV, если вы хотите разделить цвета? если вам действительно нужно работать с изображением в HSV, вам нужно вернуть его в RGB, чтобы разделить цвета, я бы сказал.
  • 0
    @OznOg В уроках люди всегда переходят в HSV ... Так что я сделал то же самое ...
Теги:
opencv
image-processing
colors
mask

1 ответ

2
Лучший ответ

Ваши цветовые гаммы еще не совсем правильные. Также переменные в функции inRange() расположены в неправильном порядке. Это от-до, поэтому темный цвет должен быть первым. Измените ваш код на cv2.inRange(hsv_nucl, green2hsv,greenhsv) Вы можете использовать/настроить значения в приведенном ниже коде, это работает.
Результат:
Изображение 174551

С белым фоном:
Изображение 174551

import numpy as np 
import cv2

# load image
img = cv2.imread("Eding.png")
# convert to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
# set lower and upper color limits
lower_val = np.array([50,100,170])
upper_val = np.array([70,255,255])
# Threshold the HSV image to get only green colors
mask = cv2.inRange(hsv, lower_val, upper_val)
# apply mask to original image - this shows the green with black blackground
only_green = cv2.bitwise_and(img,img, mask= mask)

# create a black image with the dimensions of the input image
background = np.zeros(img.shape, img.dtype)
# invert to create a white image
background = cv2.bitwise_not(background)
# invert the mask that blocks everything except green -
# so now it only blocks the green area's
mask_inv = cv2.bitwise_not(mask)
# apply the inverted mask to the white image,
# so it now has black where the original image had green
masked_bg = cv2.bitwise_and(background,background, mask= mask_inv)
# add the 2 images together. It adds all the pixel values, 
# so the result is white background and the the green from the first image
final = cv2.add(only_green, masked_bg)

#show image
cv2.imshow("img", final)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 0
    green2hsv,greenhsv по-прежнему не правильный порядок, потому что первый элемент массива не в порядке. Ваш пример кода правильный, хотя.
  • 0
    @JD Thx !! Мне все еще интересно, возможно ли вместо фона в чёрном цвете покрасить его в белый плз?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню