Python 将图像划分为网格(比如3x3)并提取每个网格区域的像素值

Python 将图像划分为网格(比如3x3)并提取每个网格区域的像素值,python,opencv,image-processing,computer-vision,pixel,Python,Opencv,Image Processing,Computer Vision,Pixel,嗨,我正在尝试处理一组图像(比如5)。我希望每个图像都被视为一个层,该层被划分为一个3x3的网格,其中每个网格区域代表一个像素。我想从每一层(图像)中获得最大像素值,并生成最终图像,其中包含每一层的最大像素值。现在我只是尝试在一张图片上画一个网格,但我认为这不是正确的方法。关于如何获得所需解决方案的任何建议 plt.figure(figsize=(20,20)) y_start= im1.height y_end= 0 x= 100 for x in range(0,im1.width,50):

嗨,我正在尝试处理一组图像(比如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())

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

仅在终端或(Windows上的命令提示符)中,您可以获得最大3x3面积,如下所示:

magick input.png -statistic maximum 3x3 result.png
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)
然后,如果加载一系列图像,则可以获得每个图像中最大的3x3窗口,假设文件名为
1.png
2.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.displate()
以获得每个层上3x3窗口的最大值,然后可能需要调用
numpy.max.reduce()
以获得结果层上的最大值,请参阅

膨胀看起来像这样:

magick input.png -statistic maximum 3x3 result.png
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)

我不太明白。让我们取任意一个像素,比如中心像素,在每一层上,我们在中心像素周围的3x3窗口中找到最大像素,所以现在我们有5个像素放在中心位置-我们怎么做?@MarkSetchell每一层对应于每个单独的图像。因此,考虑中心像素,我们将有5个对应于中心位置的值,但是我们应该考虑最终矩阵中5个中心点的最大值。我希望这能澄清一点。您是想用Python编写这篇文章,还是只想完成这项工作并继续前进?我这样问是因为你可以在shell一行程序中使用ImageMagick,而无需编写任何代码。@MarkSetchell我的首选是python,但我非常感谢你的帮助,这样我就可以在PythonId中实现它。我的回答解决了你的问题?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢谢谢我将尝试一下,如果您能提出Python解决方案,我将不胜感激。同时,我将尝试自己用Python实现它。我尝试了您的解决方案,但我不想扩展现有的映像。它应该将图像分割成矩阵,并根据块内的像素信息比较每个块。对于最终图像,应考虑具有更多像素信息的块。我希望它能让我明白我想做什么。再次感谢您的努力。您是否尝试过ImageMagick命令?有一些名为Wand的Python绑定也可以使用。