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

时间:2019-09-30 08:01:45

标签: 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):
    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())

1 个答案:

答案 0 :(得分: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)