#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 градусов, как бы я «обрезал» это?