如何测量由自定义网格线制成的单位正方形的单色区域?

How to measure an monochrome area with unit squares made from a custom gridline?

提问人:Loc Nguyen 提问时间:6/29/2023 最后编辑:OokerLoc Nguyen 更新时间:7/1/2023 访问量:62

问:

我有一张带有这样网格线的图像,我想用由该网格线制成的单位正方形来测量每个单色区域。混合了不同颜色的方块不计算在内。在图像中,有 3 种颜色:黄色、橙色和蓝色。边框和网格线不计算在内。原始图像没有网格线。

完整图片在这里

!Image here, I'll fix this when I have 10 reputation closeup

到目前为止,我可以计算图像中黑白像素的数量,但我不知道如何自定义代码以满足我的需要。

Python OpenCV 图像处理 网格 测量单位

评论

0赞 Christoph Rackwitz 6/29/2023
单色意味着“没有颜色”(或一种色调,它的阴影)。你是什么意思?
0赞 Christoph Rackwitz 6/29/2023
听起来您想对源图像进行下采样(忽略网格),同时保持调色板或应用调色板/海报化效果?
0赞 Ooker 6/29/2023
@ChristophRackwitz例如,在图像中有 3 种颜色:黄色、橙色和蓝色。边框和网格线不计算在内。我们也有没有网格线的原始图像。这回答了你吗?

答:

0赞 Leon Klute 6/29/2023 #1

您可以使用 np.unique 来计算 img 中所有颜色的出现次数:

import cv2
import numpy as np
  
# reading the image data from desired directory
img = cv2.imread("1OKN8m.jpg")
cv2.imshow('Image',img)

img_1d = img.reshape(img.shape[0]*img.shape[1], img.shape[2])
unique_colors, counts = np.unique(img_1d, axis=0, return_counts=True)
print(f'Unique colors: {unique_colors}')
print(f'Counts: {counts}')

因为它是JPEG,所以“单色”区域包含许多不同的颜色,因此您应该根据自己的情况选择所有足够接近的独特颜色,并计算它们的单个计数。

评论

0赞 Ooker 6/29/2023
似乎这只通过像素来计算?有没有办法通过网格线制成的正方形来计数?
0赞 Ooker 6/30/2023
print(img.shape[0]*img.shape[1], img_1d.size)返回。 返回。每对中的数字不应该相同吗?4584300 13752900print(unique_colors.size, counts.size)481008 160336
0赞 Leon Klute 7/3/2023
size似乎计算的是元素的总数,而不是第一个维度的大小,这个RGB图像的数字是3倍。
0赞 Leon Klute 7/3/2023
要计算正方形,您可以缩小图像的大小,但您必须计算网格线的大小,我估计 85 byt 115: ' img = cv2.resize(img, (85, 115), interpolation=cv2.INTER_AREA) '
0赞 Ooker 7/1/2023 #2

我认为要走的方法是将图像拆分为多个网格,然后检查各个部分是否是单色的。