Как манипулировать пикселями внутри ограничительной рамки, нарисованной с помощью minAreaRect () в opencv - python - PullRequest
0 голосов
/ 03 июня 2019

У меня есть изображение с несколькими зелеными полосами.Но один из них особенный, потому что он связан с синей формой.Я хочу нарисовать ограничивающий прямоугольник, используя minAreaRect () вокруг специальной зеленой полосы.

Мне удалось нарисовать ограничивающие рамки, используя minAreaRect (), вокруг всех зеленых полос до сих пор.Но для того, чтобы отфильтровать зеленые полосы и взять только специальные, мне нужно определить, в каком блоке находятся синие пиксели.

Чтобы сделать это, я хочу проверить каждый пиксель внутри каждого блока, чтобы проверить, какой из них содержит синие пиксели.Есть ли способ идентифицировать пиксельные координаты пикселей внутри ограничительной рамки.Или есть лучший подход?

import cv2 as cv
import numpy as np

# Load the aerial image and convert to HSV colourspace
image = cv.imread("1.png")
image1 = image
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)

# Define lower and uppper limits of the color blue
low_blue = np.array([94, 80, 2])
high_blue = np.array([126, 255, 255])

# Mask image to only select blues
mask1 = cv.inRange(hsv, low_blue, high_blue)

# Change image to green where we found blue
image[mask1 > 0] = (0, 130, 0)


blurred_frame = cv.GaussianBlur(image, (5, 5), 0)
hsv = cv.cvtColor(blurred_frame, cv.COLOR_BGR2HSV)
low_green = np.array([25, 52, 72])
high_green = np.array([102, 255, 255])
mask = cv.inRange(hsv, low_green, high_green)
_, contours, _ = cv.findContours(mask, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
image[mask1 > 0] = (255, 0, 0)

for contour in contours:

    rect = cv.minAreaRect(contour)
    box = cv.boxPoints(rect)
    box = np.int0(box)
    Cx = rect[0][0]
    Cy = rect[0][1]

    cv.drawContours(image, [box], 0, (0, 0, 255), 2)

cv.imshow("Frame", image)
cv.waitKey(0)
cv.destroyAllWindows()

Вот входное изображение

https://ibb.co/h9cv4DN

Вот ожидаемый результат (ограничивающий прямоугольник обозначен фиолетовым цветом)

https://ibb.co/8Mq6Mwt

1 Ответ

0 голосов
/ 04 июня 2019

Этот ответ смотрит на все зеленые полосы на изображении.Он проверяет, содержит ли зеленая полоса синий цвет.

for contour in contours:

    rect = cv.minAreaRect(contour)
    box = cv.boxPoints(rect)
    box = np.int0(box)
    Cx = rect[0][0]
    Cy = rect[0][1]

    # Make a mask of this single green line
    mask = np.zeros_like(mask1)
    cv.drawContours(mask, [contour], 0, 255, cv.FILLED)
    sigle_green_line = cv.bitwise_and(image, image, mask = mask)
    sigle_green_line = cv.cvtColor(sigle_green_line, cv.COLOR_BGR2HSV)
    # Check how much blue is in the image
    blue_mask = cv.inRange(sigle_green_line, low_blue, high_blue)
    print(sum(sum(blue_mask)))
    # If the image is not all black (all zeros) the contour contains some blue
    if sum(sum(blue_mask)) > 0: print('This contour contains some blue')
...