嗨,我正在尝试处理一组图像(例如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())
答案 0 :(得分:1)
此后,我将研究Python解决方案,但是您可以使用 ImageMagick ,它已安装在大多数Linux发行版中,并且可用于macOS和Windows。
仅在终端机中(或在Windows中为命令提示符),您可以像这样获得最大3x3区域:
magick input.png -statistic maximum 3x3 result.png
然后,如果加载一系列图像,则可以像这样在每个文件中获得所有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.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)