图像中部分RGB矩阵可视化

news2024/9/26 3:29:30

图像中部分RGB可视化

今天室友有个需求就是模仿下面这张图画个示意图:

在这里插入图片描述

大致就是把图像中的一小部分区域的RGB值可视化了一下。他居然不知道该怎么画,我寻思这不直接秒了。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


class Plotter:
    def __init__(self, img):
        self.img = img
        self.range = None

        # 三个图的位置
        self.loc = [
            [0.01, 0.325, 0.35, 0.35],
            [0.375, 0.375, 0.25, 0.25],
            [0.71, 0.355, 0.29, 0.29],
        ]
        self.dloc = [0.02, 0.02]  # 表格间距
        self.facecolor = plt.get_cmap("Accent")(range(3))  # 表格颜色

    def plot_img(self, fig):
        img_range = self.range
        axes = fig.add_axes(self.loc[0])
        axes.imshow(self.img, aspect="auto")
        axes.add_patch(
            plt.Rectangle(
                (img_range[0], img_range[2]),
                img_range[1] - img_range[0],
                img_range[3] - img_range[2],
                fill=False,
                edgecolor="red",
                linewidth=2,
            )
        )
        axes.axis("off")

    def plot_table(self, fig, table):
        loc = self.loc[2]
        dloc = self.dloc
        facecolor = self.facecolor

        for i in range(table.shape[2]):
            axes = fig.add_axes(
                [loc[0] - dloc[0] * i, loc[1] - dloc[1] * i, loc[2], loc[3]],
            )
            axes.table(
                cellText=table[:, :, i],
                loc="center",
                cellColours=np.full(
                    (table.shape[0], table.shape[1], 4),
                    facecolor[i],
                    dtype=self.facecolor[0].dtype,
                ),
                bbox=[0, 0, 1, 1],
            )
            axes.axis("off")

    def plot_range_img(self, fig, range_img):
        axes = fig.add_axes(self.loc[1])
        axes.imshow(range_img, aspect="auto")

        axes.set_xticks([])
        axes.set_yticks([])
        spines = ["left", "right", "bottom", "top"]
        for spine in spines:
            axes.spines[spine].set_color("r")

    def plot_path(self, axes, x1, x2):
        x = np.linspace(x1[0], x2[0], 100)
        y = np.linspace(x1[1], x2[1], 100)
        axes.set_xlim(0, 1)
        axes.set_ylim(0, 1)
        axes.plot(x, y, "r--")

    def range_points_on_img(self):
        img_range = self.range
        loc = self.loc[0]
        luloc = loc[0] + img_range[0] / self.img.shape[0] * loc[2]
        # axes坐标系y轴方向相反
        ldloc = loc[1] + (self.img.shape[1] - img_range[2]) / self.img.shape[1] * loc[3]
        dx = (img_range[1] - img_range[0]) / self.img.shape[0] * loc[2]
        dy = (img_range[3] - img_range[2]) / self.img.shape[1] * loc[3]
        return [(luloc + dx, ldloc - dy), (luloc + dx, ldloc)]

    def plot_img2range(self, axes):
        img_points = self.range_points_on_img()
        range_points = [
            (self.loc[1][0], self.loc[1][1]),
            (self.loc[1][0], self.loc[1][1] + self.loc[1][3]),
        ]
        print(img_points)
        self.plot_path(axes, img_points[0], range_points[0])
        self.plot_path(axes, img_points[1], range_points[1])

    def plot_range2table(self, axes):
        range_points = [
            (self.loc[1][0] + self.loc[1][2], self.loc[1][1]),
            (self.loc[1][0] + self.loc[1][2], self.loc[1][1] + self.loc[1][3]),
        ]
        table_points = [
            (self.loc[2][0] - self.dloc[0] * 2, self.loc[2][1] - self.dloc[1] * 2),
            (
                self.loc[2][0] - self.dloc[0] * 2,
                self.loc[2][1] + self.loc[2][3] - self.dloc[1] * 2,
            ),
        ]
        self.plot_path(axes, range_points[0], table_points[0])
        self.plot_path(axes, range_points[1], table_points[1])

    def plot_line(self, fig):
        axes = fig.add_axes([0, 0, 1, 1])
        self.plot_img2range(axes)
        self.plot_range2table(axes)
        axes.axis("off")

    def plot(self, img_range):
        self.range = img_range
        range_img = self.img[
            img_range[0] : img_range[1], img_range[2] : img_range[3], :
        ]
        fig = plt.figure()
        self.plot_img(fig)
        self.plot_range_img(fig, range_img)
        self.plot_table(fig, range_img)
        self.plot_line(fig)
        plt.show()


if __name__ == "__main__":
    img_path = "lena_color_512.tif"
    img = cv.imread(img_path, cv.IMREAD_UNCHANGED)
    img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
    p = Plotter(img)
    p.plot([255, 265, 255, 265])

其实就是先画三个主图,一个全部的,一个小范围内的,一个RGB值的表,然后画四根线就完事了。效果如下:

在这里插入图片描述

唯一要注意的是 Axes 坐标系和图像的坐标系中Y轴是相反的,然后其他 axes.imshowaxes.table 都让它填满整个 Axes 就好了,要不然它给你自适应了,不好算几根连线的位置。

这里写的时候没想好,按 copilot 生成的 img_range 形式写下去了,目前是 [x起点,x终点,y起点,y终点] 的格式,换成 [x起点,y起点,x范围,y范围] 会更统一一点。但也懒得改了,一小时的工作时间白嫖室友一顿必胜客,很舒服。

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

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

相关文章

Flink定制化功能开发,demo代码

前言: 这是一个Flink自定义开发的基础教学。本文将通过flink的DataStream模块API,以kafka为数据源,构建一个基础测试环境;包含一个kafka生产者线程工具,一个自定义FilterFunction算子,一个自定义MapFunctio…

uniapp中uview组件库丰富的CountTo 数字滚动使用方法

目录 #平台差异说明 #基本使用 #设置滚动相关参数 #是否显示小数位 #千分位分隔符 #滚动执行的时机 #API #Props #Methods #Event 该组件一般用于需要滚动数字到某一个值的场景,目标要求是一个递增的值。 注意 如果给组件的父元素设置text-align: cente…

【随笔】遗传算法优化的BP神经网络(随笔,不是很详细)

文章目录 一、算法思想1.1 BP神经网络1.2 遗传算法1.3 遗传算法优化的BP神经网络 二、代码解读2.1 数据预处理2.2 GABP2.3 部分函数说明 一、算法思想 1.1 BP神经网络 BP神经网络(Backpropagation Neural Network,反向传播神经网络)是一种监…

第一个 OpenGL 程序:旋转的立方体(VS2022 / MFC)

文章目录 OpenGL API开发环境在 MFC 中使用 OpenGL初始化 OpenGL绘制图形重置视口大小 创建 MFC 对话框项目添加 OpenGL 头文件和库文件初始化 OpenGL画一个正方形OpenGL 坐标系改变默认颜色 重置视口大小绘制立方体使用箭头按键旋转立方体深度测试添加纹理应用纹理换一个纹理 …

R语言【paleobioDB】——pbdb_map():根据化石记录绘制地图

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新,该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后,执行本地安装。 Usage pbdb_map (data, col.int"white" ,p…

AI-图片转换中国风动漫人物

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI卡通秀原理 2. …

序章 搭建环境篇—准备战士的剑和盾

第一步:安装node.js Node.js 内置了npm,只要安装了node.js,就可以直接使用 npm,官网地址: Download | Node.js 在这里不建议安装最新版本的node.js,可以选跟我一样的版本,node版本v16.13.2 链…

Maven多模块项目打包:Unable to find main class

目录 一、错误来源 二、原始pom文件 common模块 pojo模块 server模块 父工程 三、解决方法 四、修改pom文件 common模块 pojo模块 server模块(不改动) 父工程 一、错误来源 使用Maven对项目进行多模块开发,在项目打包时出现错误…

Grind75第8天 | 278.第一个错误的版本、33.搜索旋转排序数组、981.基于时间的键值存储

278.第一个错误的版本 题目链接:https://leetcode.com/problems/first-bad-version 解法: 二分查找。 如果一个版本为错误版本(isBadVersion为True),那么第一个错误版本在该版本左侧(包括该版本&#x…

nova组件讲解和glance对接swift

1、openstack架构 (1)openstack是一种SOA架构(微服务就是从这种架构中剥离出来的) (2)这种SOA架构,就是把每个服务独立成一个组件,每个组件通过定义好的api接口进行互通 &#xff…

RK3568平台 温度传感器芯片SD5075

一.SD5075芯片简介 SD5075 是一款高准确度温度传感器芯片内含高精度测温 ADC,在-40C ~100C 范围内典型误差小于0.5C,在-55C~125C 范围内典型误差小于士1.0C。通过两线 IC/SMBus接口可以很方便与其他设备建立通信。设置 A2~A0 的地址线,可支持…

如何使用“通义听悟”提高工作和学习效率

如何使用通义听悟提高工作和学习效率 通义听悟是一款利用人工智能技术,自动为音频和视频内容提供转写、翻译、总结、检索等功能的在线工具。它可以在会议、学习、访谈、培训等场景下,帮助您记录、阅读、整理、复习音视频信息,成为您的工作和…

深入浅出线程原理

Linux 中的线程本质 线程接口由 Native POSIX Thread Library 提供,即:NPTL 库函数 线程被称为轻量级进程 (Light Weight Process) 每一个线程在内核中都对应一个调度实体,拥有独立的结构体 (task_struct) 内核设计:一个进程对…

python + selenium 初步实现数据驱动

如果在进行自动化测试的时候将测试数据写在代码中,若测试数据有变,不利于数据的修改和维护。但可以尝试通过将测试数据放到excel文档中来实现测试数据的管理。 示例:本次涉及的项目使用的12306 selenium 重构------三层架构 excel文件数据如…

【RV1126 学习】SDK/ U-Boot/kernel/rootfs 编译学习

文章目录 RV1126芯片介绍rv1126 模块代码目录相关说明 SDK 包下的脚本使用build.sh 脚本使用envsetup.sh 脚本使用mkfirmware.sh 脚本使用rkflash.sh 脚本使用 U-Boot 编译和配置uboot 的配置修改编译操作 kernel 的修改编译rootfs 编译和配置buildroot 配置busybox 配置 RV112…

如何从电脑找回/恢复误删除的照片

按 Shift Delete 以后会后悔吗?想要恢复已删除的照片吗?好吧,如果是这样的话,那么您来对地方了。在本文中,我们将讨论如何从 PC 中检索已删除的文件。 自从摄影的概念被曝光以来,人们就对它着迷。早期的照…

SQL:一行中存在任一指标就显示出来

当想要统计的两个指标不在一张表中时,需要做关联。但很多情况下,也没有办法保证其中一张表的维度是全的,用left join或right join可能会导致数据丢失。所以借助full join处理。 如,将下面的数据处理成表格中的效果(维…

IntersectionObserver

IntersectionObserver 这个API主要实现图片懒加载、加载更多等等。 该API作用是观察两个元素之间有没有交叉,有没有重叠 现在要做的是当图片跟视口有交叉的情况下,把data-src的图片路径替换给src属性 //第一个参数是 回调,第二个参数的 配置…

论文翻译 | 【深入挖掘Java技术】「底层原理专题」深入分析一下并发编程之父Doug Lea的纽约州立大学的ForkJoin框架的本质和原理

深入分析一下并发编程之父Doug Lea的纽约州立大学的ForkJoin框架的本质和原理这里写目录标题 前提介绍摘要引言设计性能优秀任务粒度合理Cilk框架和基础fork/join的可移植性FJTask框架设计思路线程映射关系拆分子任务排队及调度设置调度管理 标准示例 未完待续 前提介绍 Doug …

【linux驱动开发】在linux内核中注册一个杂项设备与字符设备以及内核传参的详细教程

文章目录 注册杂项设备驱动模块传参注册字符设备 开发环境: windows ubuntu18.04 迅为rk3568开发板 注册杂项设备 相较于字符设备,杂项设备有以下两个优点: 节省主设备号:杂项设备的主设备号固定为 10,在系统中注册多个 misc 设备驱动时&…