OpenCV фильтрует изображение красным и зеленым - PullRequest
0 голосов
/ 01 августа 2020

Я хотел бы отфильтровать изображение ниже на зеленый и красный. Цель фильтрации изображения - иметь возможность подсчитать красные и зеленые ячейки на изображении. Я использую OpenCV для фильтрации изображения, но результат не такой, как ожидалось, см. Изображения в красном и зеленом фильтрах. Кажется, что отфильтрованное изображение содержит больше ячеек любого цвета, что приведет к неправильному подсчету. Могу ли я что-нибудь сделать в коде, чтобы улучшить это, пожалуйста? Большое спасибо заранее.

import cv2

image = cv2.imread('2020-03-Sequence-p4-Day-0_Position070.png')

b = image.copy()
# set green and red channels to 0
b[:, :, 1] = 0
b[:, :, 2] = 0


g = image.copy()
# set blue and red channels to 0
g[:, :, 0] = 0
g[:, :, 2] = 0

r = image.copy()
# set blue and green channels to 0
r[:, :, 0] = 0
r[:, :, 1] = 0


# RGB - Blue
cv2.imshow('B-RGB', b)

# RGB - Green
cv2.imshow('G-RGB', g)

# RGB - Red
cv2.imshow('R-RGB', r)

cv2.waitKey(0)

Оригинал enter image description here image converted_images введите описание изображения здесь

1 Ответ

0 голосов
/ 17 августа 2020

Вы имеете в виду что-то вроде этого:

import cv2
import numpy as np

## Read
img = cv2.imread("img.jpg")

## convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

mask_green = cv2.inRange(hsv, (36, 25, 25), (70, 255,255))
mask_red1 = cv2.inRange(hsv, (0, 70, 50), (10, 255, 255))
mask_red2 = cv2.inRange(hsv, (170, 70, 50), (180, 255, 255))
mask_orange = cv2.inRange(hsv, (10, 100, 20), (25, 255, 255))
mask_yellow = cv2.inRange(hsv, (21, 39, 64), (40, 255, 255))

## slice the red and orange
imask_red1 = mask_red1>0
imask_red2 = mask_red2>0
imask_orange = mask_orange>0
imask_yellow = mask_yellow>0
red = np.zeros_like(img, np.uint8)
red[imask_red1] = img[imask_red1]
red[imask_red2] = img[imask_red2]
red[imask_orange] = img[imask_orange]
red[imask_yellow] = img[imask_yellow]

## slice the green
imask_green = mask_green>0
green = np.zeros_like(img, np.uint8)
green[imask_green] = img[imask_green]

## save 
cv2.imwrite("green.jpg", green)
cv2.imwrite("red.jpg", red)

enter image description here введите описание изображения здесь

Часть зеленого переносится в красную версию, я думаю, вы можете отрегулировать диапазон hsv, чтобы исправить это

...