Сетка на изображении для вычисления среднего цвета - PullRequest
0 голосов
/ 01 октября 2019

Привет! Я сделал обнаружение краев на изображении, и теперь я хочу вычислить средний цвет пикселей на изображении. Для этого сначала мне нужно преобразовать изображение в сетку 10х10, где каждый элемент сетки представляет отдельный блок. Для каждого блока мне нужно вычислить средний цвет. Есть ли способ сделать это? Любая помощь приветствуется. В настоящее время я могу нарисовать сетку на изображении, но я не могу сделать вычисления из этого.

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('images/0.jpg',0)
edges = cv2.Canny(img,100,200)

plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show()

1 Ответ

1 голос
/ 01 октября 2019

Один из способов - изменить размер изображения с помощью усреднения блоков. Для этого нужно вычислить новый размер так, чтобы каждый пиксель в новом изображении представлял блок пикселей 10x10 в оригинале. Затем просто распечатайте список значений в измененном изображении. Это будут средние цвета для каждого блока 10x10.

Ввод:

enter image description here

import cv2

img = cv2.imread('lena_crop.png')

# get shape
h, w, c = img.shape
print (h,w,c)


# compute scale size so that each pixel in the resize image corresponds to 10x10 original pixels
hs = round(h/10)
ws = round(w/10)
print(hs,ws)

# resize image using block averaging
resized = cv2.resize(img, (ws,hs), interpolation = cv2.INTER_AREA)

cv2.imshow("Resized image", resized)
cv2.waitKey(0)
cv2.destroyAllWindows()

print(list(resized))


Начнем с изображения размером 250x250. Новый размер будет 25х25. Первые несколько значений, которые получаются:

[array([[112, 132, 225],
       [109, 132, 225],
       [111, 138, 231],
       [ 85,  69, 173],
       [ 83,  73, 178],
       [ 87,  83, 188],
       [ 93,  96, 204],
       [ 95,  99, 206],
       [ 97, 101, 210],
       [ 97, 101, 209],
       [ 99, 101, 206],
       [ 95,  99, 206],
       [ 97, 101, 208],
       [ 96,  98, 204],
       [ 96,  97, 203],
       [ 94,  89, 190],
       [101, 103, 201],
       [111, 132, 223],
       [107, 131, 224],
       [106, 129, 221],
       [133, 176, 237],
       [106, 117, 197],
       [ 94,  91, 189],
       [ 94,  93, 193],
       [ 93,  92, 193]], dtype=uint8), array([[110, 133, 228],
       [112, 140, 230],
       [105, 130, 227],
       [ 78,  67, 173],
       [ 80,  71, 178],
       [ 84,  80, 189],
       [ 91,  93, 203],
       [ 94,  96, 206],
       [ 95,  96, 209],
       [ 96,  97, 209],
       [ 90,  92, 206],
       [ 92,  93, 203],
       [ 98,  98, 205],
       [ 95,  96, 205],
       [ 92,  93, 205],
       [ 94,  90, 197],
       [ 97,  89, 191],
       [117, 132, 223],
       [110, 133, 225],
       [109, 129, 223],
       [110, 131, 220],
       [140, 185, 236],
       [ 92,  89, 187],
       [ 94,  91, 190],
       [ 72,  40, 118]], dtype=uint8), array([[111, 138, 231],
...
...