Python / opencv:使图像的像素为最接近的4像素的平均值

时间:2017-01-23 14:18:01

标签: python opencv

我需要降低图片的实际分辨率,以便4像素矩形中的每个像素都是这4像素的平均值。

p1 p2 p6 p7         a1 a1 a2 a2 
p3 p4 p8 p9  ... -> a1 a1 a2 a2 where a1 = average(p1, p2, p3, p4), a2 = average(p6, p7, p8, p9) etc

使用python / opencv不能操纵单个像素是否可以有效地做到这一点?双线性/最近邻居是否重新缩小并返回到原始分辨率会产生请求的结果(而不仅仅是视觉效果)?图片是单色的。

1 个答案:

答案 0 :(得分:2)

如果您对基于透明numpy / indexing的解决方案感兴趣,请尝试以下方法:

我使用一些虚拟数据来测试解决方案:

img = np.array([range(0,4), range(4, 8), range(8, 12), range(12, 16)])

这为我们提供了以下'形象':

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

然后我通过采用每一个元素来创建四个子图像:

subimg1 = img[::2, ::2]
subimg2 = img[1::2, ::2]
subimg3 = img[::2, 1::2]
subimg4 = img[1::2, 1::2]

现在您可以使用numpy平均相应的样本:

average = np.average([subimg1, subimg2, subimg3, subimg4], 0)

创建输出:

output = np.zeros(img.shape)
output[::2, ::2] = average
output[1::2, ::2] = average
output[::2, 1::2] = average
output[1::2, 1::2] = average

给定测试数据的输出为:

[[  2.5   2.5   4.5   4.5]
 [  2.5   2.5   4.5   4.5]
 [ 10.5  10.5  12.5  12.5]
 [ 10.5  10.5  12.5  12.5]]