改变图像中特定区域的颜色

news2024/12/22 23:21:01

背景与原理

再训练施工即系模型中,发现大量施工机械都是黄色的,我需要把它们换成蓝色的,以增强模型使用可靠性。

目前没有尝试深度学习算法,只是简单的进行了处理。

核心目的:通过人工标注与opencv的结合,来把”“黄色吊车”变成“蓝色吊车”。

原理可以概括为以下内容:

1.我会先框选出图片中的区域A和区域B,
2.然后计算出A区域与B区域的平均RGB值的差异D,
3.然后将C区域中所有与A区域颜色相似的像素点,加上差异D,
4.C区域中的颜色A尽可能的变为颜色B

C可以是整个吊车的吊臂,A是C中一小块区域,我需要把C中与A相似的像素点都变成类似于B的颜色。B可以是其他颜色的施工机械上的一块油漆,主要是提供“蓝色”,A和C都是黄色的。

实现效果

效果如下图所示,我让机械的“黄色”变成了旁边农用车的“蓝色”:
在这里插入图片描述

实现方法

  1. 辅助函数:

# 在区域B中随机选择一些颜色
def randomly_select_pixel(top_pixels):
    # 从出现次数最多的像素点中随机选择一个
    selected_pixel = random.choice(top_pixels)[0]
    return selected_pixel

# 计算某个区域的平均rgb值
def calculate_mean_rgb(image, region, num, top_n=10):
    # 提取区域
    sub_img = image[region[1]:region[3], region[0]:region[2]]
    cv2.imwrite(r'C:\Users\28715\Desktop\tmp\{}.png'.format(num), sub_img)
    # 计算区域的平均RGB值
    mean_rgb = sub_img.mean(axis=(0, 1))

    # 将区域展平并转换为元组形式
    pixels = [tuple(pixel) for row in sub_img for pixel in row]

    # 统计每个像素的出现次数
    pixel_counts = Counter(pixels)

    # 找出出现次数最多的top_n个像素
    most_common_pixels = pixel_counts.most_common(top_n)
    return mean_rgb, most_common_pixels

2.变化颜色的核心函数

# 主函数,将C区域中,与A区域中类似的颜色,换成B区域中的颜色
def adjust_color(image, region_c, mean_rgb_a, mean_rgb_b, common_rgb_b, threshold=50, noise_range=1):
    diff = mean_rgb_b - mean_rgb_a
    sub_img_c = image[region_c[1]:region_c[3], region_c[0]:region_c[2]]

    # 计算区域C中每个像素与区域A平均颜色的差异
    color_diff = np.linalg.norm(sub_img_c - mean_rgb_a, axis=-1)

    # 找到差异小于阈值的像素
    mask = color_diff < threshold

    # 调整这些像素的颜色
    sub_img_c[mask] = randomly_select_pixel(common_rgb_b)
    # 确保颜色值在有效范围内 [0, 255]
    sub_img_c = np.clip(sub_img_c, 0, 255)

    # 替换区域C
    image[region_c[1]:region_c[3], region_c[0]:region_c[2]] = sub_img_c
    return image

3.使用。你可以想想,一个吊车分为车身,吊臂等部分。标注的时候,你可以把整条吊臂当做"C“,把吊臂上最有代表性的一小块区域"A"标出来,然后再标一下目标颜色的提供者“B”,就可以把整个吊臂都变成类似于B区域的颜色了。我标了三个,效果如开始部分的图片所示。

if __name__ == "__main__":
    # 读取图像
    image = cv2.imread(r'C:\Users\28715\Desktop\tmp\demo.png')

    # 定义区域A, B, C (x1, y1, x2, y2),可以一次性多选几个区域,越细致效果越好。
    region_a_list = [(844, 222, 862, 250), (1176, 466, 1196, 470), (645, 185, 650, 195), (1085, 462, 1094, 479)]
    region_b = (125, 490, 180, 536)
    region_c_list = [(699, 131, 960, 344), (1157, 435, 1283, 511), (570, 88, 700, 296), (1062, 458, 1139, 481)]

    for i in range(len(region_a_list)):
        # 计算区域A和B的平均RGB值
        mean_rgb_a, _ = calculate_mean_rgb(image, region_a_list[i], 111)
        mean_rgb_b, common_rgb_b = calculate_mean_rgb(image, region_b, 222)

        # 调整区域C中的颜色
        adjusted_image = adjust_color(image, region_c_list[i], mean_rgb_a, mean_rgb_b, common_rgb_b)

        # 保存结果图像
        cv2.imwrite(r'C:\Users\Desktop\tmp\demo_change_color.png', adjusted_image)
        image = cv2.imread(r'C:\Users\Desktop\tmp\demo_change_color.png')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1887875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cybervadis认证是什么?

Cybervadis认证是一种全面且深入的网络安全评估和认证服务&#xff0c;旨在帮助组织提高其网络安全实践的成熟度&#xff0c;并有效应对不断变化的网络威胁和攻击。以下是关于Cybervadis认证的一些关键信息&#xff1a; 认证目的&#xff1a; 评估和验证组织在网络安全方面的能…

使用目标检测模型YOLO V10 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

这个是在YOLO V10源码的基础上实现的。我只是在源码的基础上做了些许的改动。 YOLO V10源码&#xff1a;YOLO V10源码 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上&#xff0c;引入了一种新的实时目标检测方法&#xff0c;解决了YOLO 以前版本在后处理和模型架…

计组_虚拟存储器

2024.06.09&#xff1a;计算机组成原理学习笔记 第11节 虚拟存储器* 1.1 分页思想1.1.1 虚拟地址/逻辑地址1.1.2 主存地址/物理地址1.1.3 页表1.1.4 分页方式的缺陷 1.2 分段思想1.2.1 虚拟地址/逻辑地址1.2.2 主存地址/物理地址1.2.3 段表 1.3 段页式思想1.3.1 虚拟地址/逻辑地…

分布式技术专题 | TCP在分布式网络中的通信机制与底层实现

深入解析分布式网络中的TCP通信协议实现 跨地域通信与资源共享网络节点与主机的定义网络技术通信机制TCP/IP协议模型TCP/IP分层机制TCP的Socket链接处理控制TCP的优势和特性自动差错控制正确性和有序性 TCP的Socket使用端口在应用程序间通信TCP的Socket使用端口套接字操作 跨地…

5G(NR) NTN 卫星组网架构

5G(NR) NTN 卫星组网架构 参考 3GPP TR 38.821 5G NTN 技术适用于高轨、低轨等多种星座部署场景&#xff0c;是实现星地网络融合发展的可行技术路线。5G NTN 网络分为用户段、空间段和地面段三部分。其中用户段由各种用户终端组成&#xff0c;包括手持、便携站、嵌入式终端、车…

鸿蒙应用开发-时间屏幕

点击下载源码&#xff1a; https://download.csdn.net/download/liuhaikang/89509449 做一个时间屏幕&#xff0c;可以点击切换白色和黑色&#xff0c;有渐变效果&#xff0c;使用到了鸿蒙的动画效果。 在这个设计中&#xff0c;我们首先引入了通用能力包&#xff0c;以实现功…

uniapp做小程序内打开地图展示位置信息

使用场景&#xff1a;项目中需要通过位置信息打开地图查看当前位置信息在地图那个位置&#xff0c;每个酒店有自己的经纬度和详细地址&#xff0c;点击地图按钮打开内置地图如图 方法如下&#xff1a; <view class"dttu" click"openMap(info.locationY,info.…

24/07/02数据结构(1.1201)算法效率顺序表

数据结构基本内容:1.时间复杂度 空间复杂度2.顺序表链表3.栈 队列4.二叉树5.排序 数据结构是存储,组织数据的方式.指相互之间存在一种或多种特定关系的数据元素的集合 算法是定义良好的计算过程.取一个或一组值为输入并产生一个或一组值为输出. 需要知道虽然选择题有20-30个…

什么是Java泛型擦除?

JDK1.5之后引入泛型擦除的概念。 目录 验证逻辑 实际编译后的结果&#xff1a; 验证例子&#xff1a; 两个类型相同&#xff0c;表面泛型都被擦出了&#xff0c;都是Arraylist。 List<String> list1 new Arraylist<>(); List<Integer> list2 new Arrayli…

自动化一些操作

下拉选择框 from selenium import webdriver from time import sleep # 导包 from selenium.webdriver.support.select import Select driver webdriver.Edge() driver.get(r"D:\WORK\ww\web自动化_day01_课件笔记资料代码\web自动化_day01_课件笔记资料代码\02_其他资料…

配置windows环境下独立浏览器爬虫方案【不依赖系统环境与chrome】

引言 由于部署浏览器爬虫的机器浏览器版本不同&#xff0c;同时也不想因为部署了爬虫导致影响系统浏览器数据&#xff0c;以及避免爬虫过程中遇到的chrome与webdriver版本冲突。我决定将特定版本的chrome浏览器与webdriver下载到项目目录内&#xff0c;同时chrome_driver在初始…

【车载开发系列】SPI总线通信技术

【车载开发系列】SPI总线通信技术 【车载开发系列】SPI总线通信技术 【车载开发系列】SPI总线通信技术一. 什么是SPI二. 应用范围三. 协议特点1&#xff09;传输速率2&#xff09;主要功能3&#xff09;拓扑结构4&#xff09;接口配置 四. SPI总线原理五. 信号列表六. SPI传输时…

攻防世界-WEB-catcat-new

前言 .................. 开干 正文 信息收集 有意思 估计是权限不够导致无法访问 我们点击几只小猫看看有什么东西 好的,?File 试试看是否存在任意文件读取 思路 成功,接下来我们尝试获取历史记录 这里补充一下知识点 /proc/self proc是一个伪文件系统&#xff0c;它提…

PDF文档如何统计字数,统计PDF文档字数的方法有哪些?

在平时使用pdf阅读或者是处理文档的时候&#xff0c;常常需要统计文档的字数。pdf在查看文字时其实很简单。 PDF文档是一种常见的电子文档格式&#xff0c;如果需要对PDF文档中的字数进行统计&#xff0c;可以使用以下方法&#xff1a; Adobe Acrobat DC&#xff1a;Adobe Ac…

Linux 防火墙开放端口

启动防火墙服务&#xff1a;systemctl start firewalld 查看防火墙开放端口 &#xff1a;firewall-cmd --list-ports 开放3306端口&#xff1a;firewall-cmd --zonepublic --add-port2375/tcp --permanent 防火墙重启&#xff1a;firewall-cmd --reload

html+css+js气球消除小游戏

气球消除小游戏 消除15个就成功 源码在图片后 点赞加关注&#xff0c;谢谢 左上角的数字显示消除气球的数量 定时随机生成气球 &#x1f388;&#x1f388;&#x1f388; 图片 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset&…

2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client实现

2.3.2 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----IO Client C实现 和IOServer主要差别&#xff1a; 1 使用Open_Client 连接 2 一定要先打开IOServer&#xff0c;再打开IO_Client 效果显示 1 C 代码实现 1.1 shareddataClient.h 头文件中引用 和sharedd…

0 TMS320F28379D 开坑

开坑原因 最近开始做实验&#xff0c;实验室的主控采用的是F2812FPGA&#xff0c;属于够用但不好用的状态。FPGA用于生成调制信号&#xff0c;DSP完成采样和控制。师兄师姐研究拓扑及调制策略&#xff0c;对驱动数量以及驱动逻辑有比较高的要求&#xff0c;因此不好脱离FPGA&a…

机器学习原理之 -- 支持向量机分类:由来及原理详解

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是统计学习理论的一个重要成果&#xff0c;广泛应用于分类和回归问题。SVM以其高效的分类性能和良好的泛化能力在机器学习领域中占据重要地位。本文将详细介绍支持向量机的由来、基本原理、构建过程及其优缺点。…

【Excel操作】Python Pandas判断Excel单元格中数值是否为空

判断Excel单元格中数值是为空&#xff0c;主要有下面两种方法&#xff1a; 1. pandas.isnull 2. pandas.isna判断Excel不为空&#xff0c;也有下面两种方法&#xff1a; 1. pandas.notna 2. pandas.notnull假设有这样一张Excel的表格 我们来识别出为空的单元格 import panda…