python 中的子图像方差错误

Wrong variance for sub-images in python

我正在尝试为每个子图像(平方)计算方差,但我无法理解某些东西。 这是第一行每个方块的方差:

[数组([[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]]),数组([[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)

我相信您在图块周围添加了一个黑色网格,然后用于计算下一个图块。 另外,我更改了你的标准偏差计算,如果你想坚持使用 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)