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

В изображении после обработки пропадёт белая сыпь в виде ободка, т.к в исходном изображении данный диапазон будет исключён

import cv2
import numpy as np
image = cv2.imread('flowers.jpg', 1)
image = cv2.resize(image, (0,0), fx=0.2, fy=0.2)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower_range = np.array([169, 100, 100], dtype=np.uint8)
upper_range = np.array([189, 255, 255], dtype=np.uint8)
mask = cv2.inRange(hsv, lower_range, upper_range)
cv2.imshow('mask',mask)
cv2.imshow('image', image)
while(1):
k = cv2.waitKey(0)
if(k == 27):
break
cv2.destroyAllWindows()
Ответы (1 шт):
Автор решения: Amgarak
→ Ссылка
import cv2
import numpy as np
# Откроем наше изображения
image = cv2.imread(r'C:\Users\Amgarak\Desktop\al8x3.png', 1)
# Преобразуем изображения в черно-белое что бы убрать свечение
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Преобразуем обратно в BGR
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
# Преобразуем в HSV для удобства в создании маски
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# Определение диапазона цвета
lower_range = np.array([0, 0, 200], dtype=np.uint8) # Нижний порог диапазона цвета
upper_range = np.array([0, 0, 255], dtype=np.uint8) # верхний порог
# Создание маски для выделения области
mask = cv2.inRange(hsv, lower_range, upper_range)
# Поиск контуров на маске
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Создаём массив, который имеет тот же размер как у image, но заполненный нулями
circle_mask = np.zeros_like(image)
# Рисуем все контуры на маске и заполняем область внутри белым цветом.
if len(contours) > 0:
cv2.drawContours(circle_mask, contours, -1, (255, 255, 255), thickness=cv2.FILLED)
# Сохраняем все point пикселей из circle_mask, которые имеют белый цвет (255, 255, 255)
white_pixels_point = np.where(circle_mask == [255, 255, 255])
new_image = np.zeros_like(image)
# Проходим по каждой найденной точке и отмечаем ее на новом изображении
for i in range(len(white_pixels_point[0])):
y = white_pixels_point[0][i]
x = white_pixels_point[1][i]
# Устанавливаем красный цвет по найденным координатам
new_image[y, x] = (0, 0, 255)
cv2.imshow('Points Image', new_image)
cv2.imwrite(r'C:\Users\Amgarak\Desktop\al8x3copy.png', new_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Пример результата (изображение взял из вопроса, обрезал шапку):
