OpenCV Python — получить среднее значение RGB вокруг точки

#python #opencv

#python #opencv

Вопрос:

Я новичок в opencv. Моя идея такова: у меня есть изображение, и я определил 4 точки (пиксели?), Например, 0x0, 0x100, 100×0, 100×00, Что было бы наилучшим подходом для проверки каждого из них, НО, создавая квадрат вокруг них. так, например, для 0x0 (ну, не самый лучший пример, поскольку он не может обойти), скажем, точка 50×50 и создайте какую-то маску вокруг этого пикселя, скажем, 10×10 пикселей квадратной ширины и высоты, а затем получите среднее значение RGB этого квадрата, а затем сделайте это для всех точек.

Пока я могу исследовать только отдельные точки для RGB, но не имею представления, как подойти к маскировке. У меня такое чувство, что у OpenCV могло бы быть какое-то простое решение для этого, но все, что я нахожу, — это сверхсложный (имхо) код, который я действительно не понимаю.

Ответ №1:

Если у вас нерегулярная область, создайте для нее маску. Вы можете вычислить среднее значение области, соответствующей маске, в Python / OpenCV следующим образом:

Ввод:

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

Маска:

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

 import cv2

# load image 
img = cv2.imread('zelda1.jpg')

# load mask as grayscale
mask = cv2.imread('zelda1_mask.png', 0)

# get mean of pixels corresponding to mask
mean = cv2.mean(img, mask=mask)

# print mean of each channel including alpha; alpha=0 is opaque
print(mean)

# mask region on input
region = img.copy()
img_masked = cv2.bitwise_and(img, img, mask=mask)

# Save result
cv2.imwrite('zelda1_region2.jpg', img_masked)

# Display input
cv2.imshow('input', img)
cv2.imshow('mask', mask)
cv2.imshow('input masked', img_masked)
cv2.waitKey(0)
cv2.destroyAllWindows()
  

Область изображения, где вычисляется среднее значение:

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

Среднее:

 (50.23702664796634, 32.84151472650771, 198.3702664796634, 0.0)
  

Комментарии:

1. это здорово, большое вам спасибо. Это даст мне хорошую отправную точку для моего проекта

Ответ №2:

Вот один из способов сделать это в Python / OpenCV, используя Numpy slicing, чтобы получить квадратную область вокруг любой заданной точки.

Ввод:

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

 import cv2

# load image 
img = cv2.imread('zelda1.jpg')

# Define point
x = 90
y = 200

# Define region size
rr = 10

# crop image  -20 pixels
crop = img[y-rr:y rr, x-rr:x rr]

# compute mean
mean = cv2.mean(crop)

# print mean of each channel including alpha; alpha=0 is opaque
print(mean)

# draw region on input
region = img.copy()
cv2.rectangle(region, (x-rr,y-rr), (x rr,y rr), (255,255,255), 1)

# Save result
cv2.imwrite('zelda1_region.jpg', region)

# Display input
cv2.imshow('input', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  

Регион:

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

Среднее значение области для каждого канала:

(53.6175, 35.9, 205.2375, 0.0)

Комментарии:

1. Это то, что мне было нужно. Однако я пришел к новой проблеме, когда область обрезки или тестирования не будет квадратной или прямоугольной, поэтому у нее не будет углов 90 градусов, как бы я «обрезал» это?