将图像分割为网格(例如3x3),并提取每个网格区域的像素值。

3

您好,我正在尝试处理一组图像(假设为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个像素要放置在中心位置 - 我们该怎么做? - Mark Setchell
@MarkSetchell 每个层对应于每个单独的图像。因此,考虑中心像素,我们将有5个值对应于中心位置,但我们应该在最终矩阵中考虑这些5个中心点的最大值。我希望这能稍微澄清一下。 - Rocky Johanson
你想用Python写这个程序,还是只是想完成任务然后继续下一个?我问这个问题是因为你可以使用ImageMagick在shell中一行命令完成它,而不需要编写任何代码。 - Mark Setchell
@MarkSetchell 我更喜欢Python,但我会感激您的帮助,这样我就可以在Python中实现它。 - Rocky Johanson
1个回答

2

之后我会提供Python解决方案,但你可以使用大多数Linux发行版上已安装的ImageMagick,并且可在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()以获取结果层上的最大值,请参见此答案
扩张操作如下所示:
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实现它。 - Rocky Johanson
我尝试了您的解决方案,但我不想扩张现有图像。它应该将图像分成矩阵,并根据块内的像素信息比较每个块。具有更多像素信息的块应被视为最终图像。我希望这清楚地说明了我要做什么。再次感谢您的努力。 - Rocky Johanson
你尝试过ImageMagick命令吗?有一个叫做Wand的Python绑定可以实现相同的功能。 - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接