【问题标题】:Find the mean of each boxes in an image in python在python中查找图像中每个框的平均值
【发布时间】:2023-04-03 05:12:01
【问题描述】:

我的这张图片有 9 个小盒子(黑色和白色盒子),每个盒子的宽度 = x 和高度 =y。我需要每个小盒子的像素值的平均值。

最初我将图像转换为数组

image = cv2.imread('x.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

这是我尝试过的,但有错误。

box_pixels = []
temp = []
p, q, r, s = 0, x, 0, y
while q <= gray.shape[0]:
    temp.append([])
    while s <= gray.shape[1]:
        for i in range(p, q):
            for j in range(r, s):
                temp.append(gray[i][j])
        r = s
        s = s+y
    p = q
    q = q + x
    box_pixels.append(temp)

print(box_pixels)

我不知道该怎么办?

【问题讨论】:

  • 这听起来像是内核问题。你最终想要做什么?模糊图像?
  • 不,不是关于模糊,如果我得到一个盒子的意思,我可以将它视为那个盒子的像素(就像是黑盒子或白盒子)
  • 所以,如果我理解正确,您基本上只是想使用平均值来调整图像大小?为什么不将cv2.resize 与您选择的插值器一起使用?
  • 绝对有可能用两个嵌套循环来做你想做的事情。但是,这种效率不会令人惊讶,因为它需要大量的模组。不过,执行 4 次嵌套循环不一定是低效的。如果您在外部两个循环 (y, x) 中遍历每个框,然后在内部两个循环中遍历这些框,那么您只访问每个像素一次,这仍然是有效的。
  • 是的,先生!我刚刚阅读了一些文档,你想要的插值器是INTER_AREA,它完全符合你目前正在做的事情,除了它处理更多的情况。我将在答案中写一些代码作为示例。

标签: python python-3.x opencv image-processing computer-vision


【解决方案1】:

所以你真正想做的就是缩小图像。假设我们的图像是 256x256 像素,我们希望将其缩小到 32x32 像素。这意味着我们将变为原始大小的 1/8 (32/256)。这也意味着每个框都是 8x8 像素。因此,要执行调整大小:

image = cv2.imread('x.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
resized = cv2.resize(gray, None, fx=32/256, fy=32/256, interpolation=cv2.INTER_AREA)

这应该让您了解如何使用宽度/高度坐标来计算正确的调整大小值。

【讨论】:

  • 调整大小很好,但在图像中存在错误(如模糊图像或图像不清晰)等情况下无济于事,因为在这种情况下像素不同一样的小盒子
猜你喜欢
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 2013-02-11
相关资源
最近更新 更多