查找一张图片中颜色重复色检查程序

想做一个颜色重复色检查程序。请各位帮忙看看指点一下。参考图片如下
如果图片中有一样的颜色色块,就将图片中的重复颜色用红色线连接在一起。
没有的话显示一个没有的提示,或者不显示红色连线

img


想实现一个这样的效果

img


# 导入PIL库
from PIL import Image

# 打开图片文件
img = Image.open("image.png")

# 获取图片的宽度和高度
width, height = img.size

# 创建一个列表,用于存储相同颜色的色块
color_blocks = []

# 遍历图片的每个像素
for x in range(width):
    for y in range(height):
        # 获取像素的颜色值(RGB格式)
        color = img.getpixel((x, y))
        # 定义一个标志,表示是否找到相同颜色的色块
        found = False
        # 遍历已经存储的相同颜色的色块
        for block in color_blocks:
            # 如果当前像素的颜色与某个色块的颜色相同,并且当前像素与该色块有邻接关系(上下左右四个方向)
            if color == block["color"] and (abs(x - block["x"]) <= 1 or abs(y - block["y"]) <= 1):
                # 更新该色块的位置和大小信息(取最小和最大值)
                block["x"] = min(block["x"], x)
                block["y"] = min(block["y"], y)
                block["w"] = max(block["w"], x - block["x"] + 1)
                block["h"] = max(block["h"], y - block["y"] + 1)
                # 将标志设为True,表示找到相同颜色的色块
                found = True
                # 跳出循环,不再遍历其他色块
                break
        # 如果没有找到相同颜色的色块,则创建一个新的字典,存储当前像素的位置和大小信息(初始为1*1),以及其颜色值,并将其添加到列表中
        if not found:
            new_block = {"x": x, "y": y, "w": 1, "h": 1, "color": color}
            color_blocks.append(new_block)

# 打印列表中的每个元素(相同颜色的色块)
for block in color_blocks:
    print(f"Color: {block['color']}, Position: ({block['x']}, {block['y']}), Size: ({block['w']}, {block['h']})")

# 导入PIL库中的ImageDraw模块
from PIL import ImageDraw

# 创建一个ImageDraw对象,用于绘制图形
draw = ImageDraw.Draw(img)

# 定义红色的RGB值
red = (255, 0, 0)

# 遍历列表中的每个元素(相同颜色的色块)
for block in color_blocks:
    # 获取该色块的位置和大小信息
    x = block["x"]
    y = block["y"]
    w = block["w"]
    h = block["h"]
    # 计算该色块的左上角和右下角的坐标
    left_top = (x, y)
    right_bottom = (x + w - 1, y + h - 1)
    # 在图片上绘制一个红色的矩形,表示该色块的边界
    draw.rectangle([left_top, right_bottom], outline=red)

# 显示修改后的图片
img.show()

既然是色块,那我觉得你这种一个个像素去遍历的方法不合适。opencv有重载位运算符,你既然都知道要找的色块颜色,直接res=img==[0,0,255]这样你的res就是一张[0,0,255]这个颜色的掩码,将之贴到原图上面,出来的结果就是这张图片的所有像素为除了[0,0,0]外,剩下的就是[0,0,255]的区域,速度快而且精准,剩下的用找轮廓的方式,找到所有这个色块的轮廓,剩下的就很简单了,轮廓连线即可。如果你要找的是[0,0,0]d的话,将其他颜色设置为【255,255,255】也是可以做到的。