Неправильная дисперсия для подизображений в python - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь вычислить для каждого подизображения (квадрата) дисперсию, и я не могу что-то понять. Вот дисперсия для каждого квадрата для первой строки:

[массив ([[0.]]), Массив ([[12594.46370602]]), массив ([[14952.43356228]])), массив ([ [1968.53027344]]), массив ([[1968.53027344]]), массив ([[1968.53027344]])), массив ([[1968.53027344]])), массив ([[13495.383811]])), массив ([[0.]] ), массив ([[10932.52408504]]), массив ([[1968.53027344]]), массив ([[1968.53027344]]), массив ([[1968.53027344]])), массив ([[1968.53027344]]), массив ([ [1968.53027344]]), array ([[1968.53027344]])

Я согласен, что из-за формулы, когда я получаю черный квадрат, у меня нулевая дисперсия, потому что каждый пиксель стоит 0 в квадрате и Значит, квадрат тоже вполне логичен. Но я получил 1968,53027344 для белых пикселей, тогда как ясно, что нет никакой разницы, все квадраты белые, и из-за формулы каждый пиксель в этом квадрате стоит 255, так как это изображение в градациях серого, и поэтому среднее значение также, так У меня должно быть 0, верно?

Вот код:

im =  cv2.imread('path.png', 0)
imgheight=im.shape[0]
imgwidth=im.shape[1]

y1 = 0
M = imgheight//16
N = imgwidth//16

v=[]

for y in range(0,imgheight,M):
    for x in range(0, imgwidth, N):
        y1 = y + M
        x1 = x + N
        tiles = im[y:y+M,x:x+N]
        std=cv2.meanStdDev(tiles)[1]
        std=std*std
        v.append(std)

        cv2.rectangle(im, (x, y), (x1, y1), (0, 255, 0))
        cv2.imwrite("save/" + str(x) + '_' + str(y)+".png",tiles)

cv2.imwrite("pic.png",im)

enter image description here

1 Ответ

3 голосов
/ 03 марта 2020

Я полагаю, что вы добавляете черную сетку вокруг плитки, которая затем используется в расчете для следующей плитки. Кроме того, я изменил ваш расчет стандартного отклонения, он может работать с meanStdDev, если вы хотите придерживаться этого

Это сработало для меня:

import cv2
import numpy as np
im =  cv2.imread('path.png', 0)
imgheight=im.shape[0]
imgwidth=im.shape[1]

y1 = 0
M = imgheight//16
N = imgwidth//16

v=[]

for y in range(0,imgheight,M):
    for x in range(0, imgwidth, N):
        y1 = y + M
        x1 = x + N
        tiles = im[y:y+M,x:x+N]
        std=np.std(tiles)
        std=std*std
        v.append(std)

for y in range(0,imgheight,M):
    for x in range(0, imgwidth, N):
        y1 = y + M
        x1 = x + N
        tiles = im[y:y+M,x:x+N]
        cv2.rectangle(im, (x, y), (x1, y1), (0, 255, 0))
        cv2.imwrite("save/" + str(x) + '_' + str(y)+".png",tiles)

cv2.imwrite("pic.png",im)

Я думаю, вы также можете сделать это, чтобы избежать несколько петель:

im =  cv2.imread('path.png', 0)
imgheight=im.shape[0]
imgwidth=im.shape[1]

y1 = 0
M = imgheight//16
N = imgwidth//16

v=[]

for y in range(0,imgheight,M):
    for x in range(0, imgwidth, N):
        y1 = y + M
        x1 = x + N
        tiles = im[y:y+M,x:x+N]
        std=cv2.meanStdDev(tiles)[1]
        std=std*std
        v.append(std)

        cv2.rectangle(im, (x, y), (x1 - 1, y1 - 1), (0, 255, 0))
        cv2.imwrite("save/" + str(x) + '_' + str(y)+".png",tiles)
cv2.imwrite("pic.png",im)
...