论文绘图——局部细节放大

news2024/9/20 18:45:42

文章目录

  • 前言
  • 一、绘图1.0版
  • 二、绘图2.0版
  • 三、总结


前言

我们经常在论文中会看到下面这些样式的图片:在图片中使用矩形框框出感兴趣的区域,然后在底部或者其他位置附上对应的局部放大的细节图,简洁好看。✨
曾尝试使用过PPT制作,也能得到类似的效果,但是比较费时间,最关键的是如果要在两张图片中放大同一个位置的细节的话,很难定位到同一个区域。😦
因此,想到使用python来画这种图,可以简单实现这种好看的科研绘图了。大家如果有更便捷的方式,欢迎分享。🧐

在这里插入图片描述
在这里插入图片描述


一、绘图1.0版

  • 思路:实现步骤非常简单:
获取放大区域的左上角和右下角的像素坐标
加框并截出区域
放大至和原图等宽/等高
加上边框
  • 注意几个地方:

    • 获取左上和右下坐标可以使用画图软件得到,鼠标移动时可以实时显示像素的坐标。但是这里更推荐使用下面这个网站获取坐标,它实际上是用来制作数据集的一个网站,不过这里拿来使用获取坐标也非常适合,因为chu可以实时显示鼠标所在像素的坐标以外,还可以显示矩形框的区域。
      https://www.makesense.ai/
      在这里插入图片描述
    • 放大到和原图等宽/高时,注意要给矩形框的线宽留一部分空余(其实就是放大到原图的宽度减去2倍的矩形框的线宽),而且不能先给放大的区域加上矩形框然后再放大,这样的话,矩形框的线框也会被放大,影响最终视图效果。
  • 代码:

import cv2
import numpy as np
imgpath = r'56.png'
image = cv2.imdecode(np.fromfile(imgpath, dtype=np.uint8), cv2.IMREAD_COLOR)

# 放大图位置

a = (608,303)  #矩形框左上角坐标
b = (657,331)  #矩形框右下角坐标


lw = 2   # 矩形框线条宽度
# 截出放大的部分
img_magnify = image[a[1]-lw:b[1]+lw,a[0]-lw:b[0]+lw,:]

# 计算缩放比例
new_W = image.shape[1] - 2*lw
ratio = float(new_W) / img_magnify.shape[1]
# 根据缩放比例计算缩放后的尺寸
new_height = int(img_magnify.shape[0] * ratio)
new_size = (new_W,new_height)
# 进行缩放
resized_image = cv2.resize(img_magnify, new_size)

# 添加边框
border_size = lw 
border_color = (0, 0, 255)  # 红色
resized_image = cv2.copyMakeBorder(resized_image, border_size, border_size, border_size, border_size, cv2.BORDER_CONSTANT, value=border_color)

# 画矩形框
cv2.rectangle(image, a, b, (0, 0, 255), lw)

# 拼接
patch = np.vstack((image, resized_image))

cv2.imshow('1',patch)
cv2.waitKey(0)
cv2.imwrite('E:/rec_56.png',patch)
  • 效果:
    在这里插入图片描述

二、绘图2.0版

上面步骤好像还是有点麻烦,不妨把获取坐标这一步骤也用python来实现,而且希望是一次性绘制两张图片的局部放大图。🔍
  • 在1.0的基础上加上利用鼠标回调函数实现即可,直接看代码:
import cv2
import numpy as np


def save_magnify(path,a,b): # a:矩形框左上角坐标  ; b:矩形框右下角坐标
    imagee = cv2.imread(path)
    lw = 2
    # 截出放大的部分
    img_magnify = imagee[a[1]-lw:b[1]+lw,a[0]-lw:b[0]+lw,:]
    
    # 计算缩放比例
    new_W = imagee.shape[1] - 2*lw
    ratio = float(new_W) / img_magnify.shape[1]

    # 根据缩放比例计算缩放后的尺寸
    new_height = int(img_magnify.shape[0] * ratio)
    new_size = (new_W,new_height)
    # 进行缩放
    resized_image = cv2.resize(img_magnify, new_size)

    # 添加边框
    border_size = lw 
    border_color = (0, 0, 255)  # 红色
    resized_image = cv2.copyMakeBorder(resized_image, border_size, border_size, border_size, border_size, cv2.BORDER_CONSTANT, value=border_color)

    # 画矩形框
    cv2.rectangle(imagee, a, b, (0, 0, 255), lw)

    # 拼接
    patch = np.vstack((imagee, resized_image))
    cv2.imshow(path.split('\\')[-1],patch)
    cv2.waitKey(0)
    # cv2.imwrite("E:\png_jpg"+  '/' + path.split('\\')[-1],patch)



# 全局变量
drawing = False  # 是否正在绘制矩形框
start_x, start_y = -1, -1  # 矩形框左上角坐标
end_x, end_y = -1, -1  # 矩形框右下角坐标


def draw_rectangle(event, x, y, flags, param):
    global drawing, start_x, start_y, end_x, end_y

    if event == cv2.EVENT_LBUTTONDOWN:        # 左键击下 
        drawing = True
        start_x, start_y = x, y

    elif event == cv2.EVENT_LBUTTONUP:        # 左键弹起
        drawing = False
        end_x, end_y = x, y

    if drawing:
        # 绘制矩形框
        image_copy = image.copy()
        cv2.rectangle(image_copy, (start_x, start_y), (x, y), (0, 0, 255), 2)
        cv2.imshow("Image", image_copy)

    if not drawing and start_x != -1 and start_y != -1:
        # 显示矩形框的左上角和右下角坐标
        print(f"矩形框左上角坐标:({start_x}, {start_y})")
        print(f"矩形框右下角坐标:({end_x}, {end_y})")
        for i in range(1):
            save_magnify(image_path,a = (start_x,start_y),b = (end_x,end_y))
            save_magnify(image_path_2,a = (start_x,start_y),b = (end_x,end_y))
            break
        start_x = -1
        

if __name__ == '__main__':
    # 输入图像路径
    image_path = r'F:\Picture\a1.jpg'
    image_path_2 = r'F:\Picture\a2.jpg'

    # 读取图像
    global imagee 
    image = cv2.imread(image_path)

    # 创建窗口并显示图像
    cv2.namedWindow("Image")
    cv2.imshow("Image", image)

    # 设置鼠标回调函数
    cv2.setMouseCallback("Image", draw_rectangle)

    # 循环等待按键事件
    while True:

        key = cv2.waitKey(1) & 0xFF

        # 按下 'q' 键 或者 退出窗口时  退出程序
        if key == ord('w') or cv2.getWindowProperty("Image", cv2.WND_PROP_VISIBLE) < 1:
            break

    cv2.destroyAllWindows()
  • 演示效果:
    运行后框出需要放大的区域,得到第一张图片,然后按下除了“w”的任意键,会得到第二张图片,最终退出程序。如果需要保存图片, 可以将save_magnify 最后一句取消注释即可。

在这里插入图片描述

三、总结

2.0版基本可以实现所需要的功能,不过代码也存在一些问题,后续再进行改进。

另外,这里还有好多功能没有来得及实现,例如对放大区域和原图之间的距离的调节、对一张图片中多个区域放大并显示、矩形框颜色、线框等自定义设置等,希望后面有时间给出3.0、4.0版。🐱‍👤

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

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

相关文章

用于缓存一些固定名称的小组件

项目中&#xff0c;用于缓存姓名、地名、单位名称等一些较固定名称的id-name小组件。用于减少一些表的关连操作和冗余字段。优化代码结构。扩展也方便&#xff0c;写不同的枚举就行了。 具体用法&#xff1a; {NameCacheUser.USER.getName(userId);NameCacheUser.ACCOUNT.getN…

GAN:WGAN前作

WGAN前作&#xff1a;有原则的方法来训练GANs 论文&#xff1a;https://arxiv.org/abs/1701.04862 发表&#xff1a;ICLR 2017 本文是wgan三部曲的第一部。文中并没有引入新的算法&#xff0c;而是标是朝着完全理解生成对抗网络的训练动态过程迈进理论性的一步。 文中基本是…

Django 模板引擎 (四)

一、Django模板引擎 一个强大的工具&#xff0c;用于在HTML页面中嵌入动态内容。它使用一种被称为Django模板语言&#xff08;Django Template Language&#xff09;的简单而强大的语法来处理模板。该模板语言使用”{% %}”进行标记&#xff0c;用于执行各种操作。 二、Django…

高效率:使用DBeaver连接spark-sql

提高运行效率一般采取底层使用spark引擎替换成hive引擎的方式提高效率&#xff0c;但替换引擎配置较为复杂考虑到兼容版本且容易出错&#xff0c;所以本篇将介绍使用DBeaver直接连接spark-sql快速操作hive数据库。 在spark目录下运行以下命令&#xff0c;创建一个SparkThirdSe…

TA、TB、TC油封各自用途

在机械系统应用中&#xff0c;油封在防止润滑剂从机器和轴承间隙泄漏方面发挥着至关重要的作用。在各种类型的油封中&#xff0c;常用的是TA、TB、TC密封件。本文将深入探讨这三种密封件各自的用途。 TA、TB和TC密封件都是油封的类型&#xff0c;但它们的设计和应用有所不同。…

java设计模式学习之【对象池模式】

文章目录 引言对象池模式简介定义与用途实现方式 使用场景优势与劣势对象池模式在Spring中的应用JDBC对象池示例代码地址小结 引言 对象池模式在资源管理和性能优化方面发挥着重要作用。这种模式通过重复使用已经初始化的对象&#xff0c;而不是频繁创建和销毁&#xff0c;减少…

计算机体系结构----流水线技术(三)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----计算机系统结构教程(第二版)张晨曦等 计算机体系结构----流水线技术&#xff08;三&#xff09; 3.1 流水线的基本概念3.1.1 什么是流水线3.1.2 流水线的分类1. 部件级流水线、处理机级流…

图解系列--HTTPS,认证

确保 Web 安全的HTTPS 1.HTTP 的缺点 1.1.通信使用明文可能会被窃听 加密处理防止被窃听 加密的对象可以有这么几个。 (1).通信的加密 HTTP 协议中没有加密机制&#xff0c;但可以通过和 SSL&#xff08;Secure Socket Layer&#xff0c;安全套接层&#xff09;或TLS&#xff…

搭建JMeter分布式压测环境轻松应对

引言 您想要提高您的应用程序的性能吗&#xff1f;想要确保它在高负载下仍然能够正常工作吗&#xff1f;那么&#xff0c;您一定需要一个可靠的性能测试工具来帮助您完成这个任务。 JMeter是一个广泛使用的性能测试工具&#xff0c;但是如果您的测试需求变得更加复杂和庞大&a…

数据结构与算法编程题35

用按层次顺序遍历二叉树的方法&#xff0c;统计树中具有度为1的结点数目。 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct B…

Google Chrome访问出现 NET::ERR_CERT_INVALID

Google Chrome访问出现 NET::ERR_CERT_INVALID然后访问不了当前网站&#xff0c;这个是由于证书失效了&#xff0c;临时解决方式是&#xff1a; 第一种方案&#xff1a; 在Chrome提示“您的连接不是私密连接”页面的空白区域点击一下&#xff0c;然后输入“thisisunsafe”(页…

[CustomMessages] section

[CustomMessages] section用来定义自定义的一些{cm:}常量. 一个定义和使用的例子。 [CustomMessages] CreateDesktopIconCreate a &desktop icon[Tasks] Name: desktopicon; Description: "{cm:CreateDesktopIcon}"CustomMessages是支持带参数的&#xff0c;从…

「Verilog学习笔记」状态机-重叠序列检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 读入数据移位寄存&#xff0c;寄存后的数据与序列数做对比&#xff0c;相等则flag为1&#xff0c;不等则为0 timescale 1ns/1nsmodule sequence_test2(input wire clk ,in…

Ascend C 算子开发遇到的问题及解决方法

摘要&#xff1a;在学习Ascend C算子开发进阶课程的时候&#xff0c;进行Ascend C自定义算子工程、算子调用等实验&#xff0c;在开发环境中遇到了一些问题&#xff0c;在这里记录一下。 首先如果在启智社区CANN版本为6.3 &#xff0c;要进行Ascend C算子开发&#xff0c;需要…

TA-Lib学习研究笔记——Volume Indicators (四)

TA-Lib学习研究笔记——Volume Indicators &#xff08;四&#xff09; 1.AD Chaikin A/D Line 量价指标 函数名&#xff1a;AD 名称&#xff1a;Chaikin A/D Line 累积/派发线&#xff08;Accumulation/Distribution Line&#xff09; 简介&#xff1a;Marc Chaikin提出的一…

C++ 学习之匿名名字空间的使用细节

匿名命名空间&#xff08;anonymous namespace&#xff09;是C中的一种特殊命名空间&#xff0c;它没有显式的名称。匿名命名空间可以用来定义仅在当前文件中可见的全局变量、函数和类。 由于没有名字&#xff0c;所以相当于直接引入&#xff0c;但是没有引入定义 如果发生冲…

Influx集群解决方案(Influx Proxy篇)

InFluxDB 集群搭建 本次搭建使用influx proxy 介绍 github地址:https://github.com/chengshiwen/influx-proxy/ Influx Proxy 是一个基于高可用、一致性哈希的 InfluxDB 集群代理服务&#xff0c;实现了 InfluxDB 高可用集群的部署方案&#xff0c; 具有动态扩/缩容、故障恢复…

JRT和检验共用的打印层实现

之前对接的打印和导出是C#实现的&#xff0c;如果要完全Java化就需要用Java把打印元素绘制协议用Java实现&#xff0c;这次介绍实现主体搭建&#xff0c;最终使JRT达到完全信创和跨平台目标。到这篇后&#xff0c;所有的Java难题都解决完毕&#xff0c;几天到几周之内就可以把打…

Echarts大屏可视化_04 横向柱状图模块的引入和开发

模块的引入 1.寻找官方示例引入 ECharts官方实例入口 2.引入示例 ECharts 示例 可从这里直接进入 标题、提示信息、图例都不需要所以直接删掉 <div class"column"><div class"panel bar2"><h2>柱状图-技能掌握</h2><div cla…

项目动态 | 十一月重点上线项目集锦

武清联创商会 【应用场景】商协会资源对接服务平台&#xff1b; 【核心功能】 l 利用资源对接系统&#xff0c;用户可在平台内发布自己的人脉信息、个性化标签&#xff0c;通过对接获得收益&#xff0c;实现人脉增值&#xff1b; l 利用信息发布系统&#xff0c;用户可直观…