【发布时间】: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