【问题标题】:Unexpected output when finding variance of an image in OpenCV -Python在 OpenCV -Python 中查找图像的方差时出现意外输出
【发布时间】:2015-04-27 11:09:13
【问题描述】:

我的程序在网格图像的每个窗口中查找图像的方差值。问题是当我打印它们与输出图像中显示的值不匹配的值时。我在下面添加了一个示例图片。

这是我的代码:

#import packages
import numpy as np
import cv2
import dateutil
import llist
from matplotlib import pyplot as plt
import argparse

#Read in image as grey-scale
img = cv2.imread('images/0021.jpg', 0)

#Set scale of grid 
scale = 6

#Get x and y components of image
y_len,x_len = img.shape

variance = []
for y in range(scale):
    for x in range(scale):
        #Crop image 9*9 windows
        cropped_img=img[(y*y_len)/scale:((y+1)*y_len)/scale,(x*x_len)/scale:((x+1)*x_len)/scale]

        (mean,stdv) = cv2.meanStdDev(cropped_img)
        var = stdv*stdv
        cropped_img[:] = var

        #Print mean_values array
        variance.append([var])
variance=np.asarray(variance)
np.set_printoptions(suppress=True, precision=3)
print variance.reshape(1,scale,scale)

cv2.imshow('output_var',img)
#cv2.imwrite('images/output_var_300.jpg',img,[int(cv2.IMWRITE_JPEG_QUALITY), 90])
cv2.waitKey(0)
cv2.destroyAllWindows()

这是上面代码的输出图像:

据我所知,下面的值与上面的图片不匹配。有人知道这里发生了什么吗?

print variance.reshape(1,scale,scale)
#[[[    17.208     43.201    215.305   1101.816   1591.606   2453.611]
#  [    46.664    121.162    326.59     809.223   1021.599   5330.989]
#  [    47.754     64.69     705.875   1625.177   3564.494  10148.449]
#  [    19.153    201.864    289.258    632.737   5285.449   4257.597]
#  [    37.621    159.51     271.725    282.291   2239.097    759.007]
#  [    26.108     98.456     32.958    505.609    575.916     70.741]]]

提前谢谢你。

编辑:对于感兴趣的人来说,这是一个更真实的输出图像:

【问题讨论】:

  • 他们不匹配是什么意思?据我所见,variance 与输出图像匹配,数字越小表示颜色越深,反之亦然,因此图像被正确绘制。你期待看到什么?
  • @Lawrence 好的,以数组中的第二行为例,“46.664”对应第一个深灰色块,“5330.989”对应最后一个浅灰色块,所以正如您所说,您会期望输出越低的方差越低。但是倒数第二个块是“1021.599”,它比最后一个块的值低,但更轻。如果您尝试将数组与图像匹配,您会发现它不遵循模式,数组中的第四个元素是模式被破坏的地方。
  • 是的,我明白你的意思。我首先想到的是标准化。由于每个通道的颜色表示为 0-255,因此您可能会遇到一些行为,例如溢出包装或类似情况。我会尝试规范化这些值,看看会发生什么。
  • 在下面查看我的答案。

标签: python opencv image-processing computer-vision variance


【解决方案1】:

我们以variance的第二行为例。由于每个通道的颜色值在 0-255 范围内,我们可以尝试包装您的值以适应该范围:

>>> row = [46.664, 121.162, 326.59, 809.223, 1021.599, 5330.989]
>>> wrapped = [x % 256 for x in row]
>>> wrapped
[46.66, 121.16, 70.58, 41.22, 253.59, 210.98]

瞧,现在说得通了。

【讨论】:

  • 好的,我将如何对像我这样的整个二维数组执行此操作?
  • var = [var % 256]这就是我需要做的,放在cropped_img[:] = var行之后
猜你喜欢
  • 2015-05-16
  • 2017-08-14
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多