想做一个颜色重复色检查程序。请各位帮忙看看指点一下。参考图片如下
如果图片中有一样的颜色色块,就将图片中的重复颜色用红色线连接在一起。
没有的话显示一个没有的提示,或者不显示红色连线
# 导入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】也是可以做到的。