【问题标题】:Dividing the image into a grid(say 3x3) and extracting pixel value of each grid region将图像划分为网格(例如 3x3)并提取每个网格区域的像素值
【发布时间】:2019-09-30 08:01:45
【问题描述】:

您好,我正在尝试处理一组图像(比如 5 张)。我希望将每个图像视为一个图层,该图层分为 3x3 网格,其中每个网格区域代表一个像素。我想从每一层(图像)中获取最大像素值,并从每一层生成具有最大像素值的最终图像。现在我刚刚尝试在单个图像上绘制网格,但我认为这不是正确的方法。有关如何获得所需解决方案的任何建议。

plt.figure(figsize=(20,20))
y_start= im1.height
y_end= 0
x= 100
for x in range(0,im1.width,50):
    line= ((x,y_start),(x,y_end))
    draw =ImageDraw.Draw(im1)
    draw.line(line,fill=('white'))
plt.imshow(im1)

plt.figure(figsize=(20,20))
x_start= 0
x_end= im1.height

for y in range(0,im1.height,50):
    line= ((x_start,y),(x_end,y))
    draw =ImageDraw.Draw(im1)
    draw.line(line,fill=('white'))
plt.imshow(im1)

pix_val = list(im1.getdata())

【问题讨论】:

  • 不确定我是否理解。让我们取任何像素,比如中心像素,在每一层上,我们在中心像素周围的 3x3 窗口中找到最大像素,所以现在我们有 5 个像素放置在中心位置 - 我们如何做到这一点?
  • @MarkSetchell 每层对应于每一个单独的图像。因此,考虑到中心像素,我们将有 5 个值对应于中心位置,但我们应该考虑最终矩阵中这 5 个中心点的最大值。我希望这能澄清一点。
  • 你想用 Python 写这个,还是只是想完成工作并继续前进?我问是因为您可以在 shell 单行中使用 ImageMagick 来完成,而无需编写任何代码。
  • @MarkSetchell 我的偏好是 python,但我会很感激帮助,以便我可以在 python 中实现它
  • 我的回答解决了您的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。 meta.stackexchange.com/questions/5234/…

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


【解决方案1】:

之后我将开发 Python 解决方案,但您可以使用 ImageMagick,它安装在大多数 Linux 发行版上,可用于 macOS 和 Windows。

只需在终端中,或者(Windows 上的命令提示符),您可以获得最大的 3x3 区域,如下所示:

magick input.png -statistic maximum 3x3 result.png

然后,如果您加载一系列图像,您可以获得每个像这样的所有 3x3 窗口的最大值,假设您的文件名为 1.png2.png ...:

magick [12345].png -statistic maximum 3x3 -evaluate-sequence max result.png

如果您的文件名称不同,您可能需要枚举它们:

magick base_layer.png layer1.png important_layer.png ... statistic maximum 3x3 -evaluate-sequence max result.png

如果您使用的是 v6 或更早版本的 ImageMagick,则需要在上述命令中使用 convert 代替 magick


使用 OpenCV 您将需要调用 cv2.dilate() 以在每层上获得 3x3 窗口的最大值,然后可能调用 numpy.maximum.reduce() 以在结果层中获得最大值,请参阅this answer.

膨胀看起来像这样:

import cv2
import numpy as np

# Make 3x3 structuring element for dilation
kernel  = np.ones((3,3),np.uint8)

im = cv2.imread('1.png')
dilated = cv2.dilate(im, kernel, iterations=1)

【讨论】:

  • 谢谢。我会尝试一下,如果您提出 Python 解决方案,我将不胜感激。同时,我会尝试自己在 Python 中实现它。
  • 我尝试了您的解决方案,但我不想扩大现有图像。它应该将图像划分为矩阵,并根据块内的像素信息比较每个块。最终图像应考虑具有更多像素信息的块。我希望它能清除我正在尝试做的事情。再次感谢您的努力。
  • 你试过 ImageMagick 命令了吗?有一些名为 Wand 的 Python 绑定可以实现相同的工作。
猜你喜欢
  • 2016-02-15
  • 2016-02-06
  • 1970-01-01
  • 2013-12-19
  • 2022-01-05
  • 2016-06-30
  • 2020-06-20
  • 2022-12-10
  • 1970-01-01
相关资源
最近更新 更多