根据图像绘制画像

# -*- coding: utf-8 -*-
"""
从彩色图像提取各颜色区域轮廓,并用 turtle 按区域填色绘制。
Author: ChatGPT
"""
import cv2
import numpy as np
import turtle
import json
import os
import math

#######################
# 参数区(可调)
IMG_PATH = "cinnamoroll.png"   # 待处理图片路径
K = 4                         # 颜色聚类数,视图片颜色复杂度调(3~8)
SIMPLIFY_FACTOR = 0.001         # 轮廓简化比例(与周长相关),越大越简化
MIN_REGION_AREA_RATIO = 0.00005 # 忽略太小区域(相对于图像总像素)
TURTLE_WINDOW = 1200           # turtle 画布尺寸(正方)
MARGIN = 80                    # 留白像素用于缩放
EXPORT_JSON = True             # 是否导出轮廓+颜色 JSON
JSON_PATH = "regions.json"
#######################

def rgb_to_hex(rgb):
    return '#{:02x}{:02x}{:02x}'.format(int(rgb[0]), int(rgb[1]), int(rgb[2]))

def darker_color(rgb, factor=0.7):
    return tuple(max(0, int(c*factor)) for c in rgb)

def quantize_colors_kmeans(img_bgr, k):
    # img_bgr : HxWx3 (uint8)
    Z = img_bgr.reshape((-1,3)).astype(np.float32)
    # criteria (type, max_iter, epsilon)
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.2)
    attempts = 4
    flags = cv2.KMEANS_PP_CENTERS
    compactness, labels, centers = cv2.kmeans(Z, k, None, criteria, attempts, flags)
    labels = labels.flatten().reshape((img_bgr.shape[0], img_bgr.shape[1]))
    centers = centers.astype(np.uint8)  # BGR
    return labels, centers

def find_color_regions(img_bgr, labels, centers, background_idx=None):
    h, w = labels.shape
    img_area = h*w
    regions = []
    for idx, center in enumerate(centers):
        if background_idx is not None and idx == background_idx:
            continue
        mask = (labels == idx).astype(np.uint8) * 255
        # 去噪:开/闭运
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值