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

文章目录

  • 前言
  • 一、绘图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 npdef 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*lwratio = 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_yif event == cv2.EVENT_LBUTTONDOWN:        # 左键击下 drawing = Truestart_x, start_y = x, yelif event == cv2.EVENT_LBUTTONUP:        # 左键弹起drawing = Falseend_x, end_y = x, yif 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))breakstart_x = -1if __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:breakcv2.destroyAllWindows()
  • 演示效果:
    运行后框出需要放大的区域,得到第一张图片,然后按下除了“w”的任意键,会得到第二张图片,最终退出程序。如果需要保存图片, 可以将save_magnify 最后一句取消注释即可。

在这里插入图片描述

三、总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—907.子数组的最小值之和【中等】

2023每日刷题&#xff08;四十二&#xff09; Leetcode—907.子数组的最小值之和 算法思想 参考自y神思想 实现代码 class Solution { public:int sumSubarrayMins(vector<int>& arr) {long long ans 0;const int mod 1e97;int n arr.size();stack<int>…

怎么解决 申请获取你的手机号,但该功能使用次数已达当前小程序上限,暂时无法使用。

微信出新规了&#xff0c; 获取手机号数据需要收费&#xff0c;1分钱一条。 在以前的开发中&#xff0c;获取手机号是默认不需要收费的&#xff0c;现在收费等于微信现在作为运营商一样&#xff0c;验证一个手机短信&#xff0c;需要收费 几分钱。 如果你的程序遇到了问题&am…

GPTS-生成一个动漫图像GPT

介绍 GPTs是ChatGPT的定制版本,用户可以通过组合指令、知识和功能来定制用于特定任务或主题的GPT。它们可以根据需要简单或复杂,解决从语言学习到技术支持等各种事情。 创建GPTs Plus和Enterprise用户可以在chat.openai.com/create上开始创建GPTs。 您可以通过在ChatGPT上的…

【javaWeb】HTTP协议

HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的应用层协议 HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节. 上图是通过Fiddler对访问百度搜索页时抓取的一个http协议的包。 观察抓包结果,可以看到,当前 http…

LeetCode(33)最小覆盖子串【滑动窗口】【困难】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 76. 最小覆盖子串 1.题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字…

Java数据结构之优先级队列(PriorityQueue)

1、概念 队列&#xff1a;是一种FIFO&#xff08;First-In-First-Out&#xff09;先进先出的数据结构&#xff0c;对应于生活中的排队的场景&#xff0c; 排在前面的人总是先通过&#xff0c;依次进行。 优先队列&#xff1a;是特殊的队列&#xff0c;从“优先”一词&#xff…

C# 实现微信退款及对帐

目录 需求 基础准备 关键代码 操作界面 ​编辑 退款订单类及方法 退款功能实现 对帐 支付商家后台相关要点 实时交易帐单查询 精确交易帐单查询 小结 需求 在招聘报名系统里&#xff0c;考务费支付是其中一个环节&#xff0c;支付方式很多种&#xff0c;比如银联、…

GitHub----使用记录

一、上传文件到仓库 1、首先新建一个github仓库 然后先记住这一句指令 2、下载git工具 https://git-scm.com/downloads 下载工具安装不用运行 3、使用git工具上传文件并推送 找到你想上传的文件的位置&#xff0c;右击git Bush here git init &#xff1a;初始化这个仓…

【项目实战】SpringBoot连接openGauss

一&#xff1a;Docker安装openGauss 1.下载openGauss 安装好Docker好以后&#xff0c;执行如下命令下载openGauss3.0镜像。docker pull enmotech/opengauss:3.0.0 2.运行openGauss 执行如下命令docker run -itd --name opengauss \ --restartalways \ --privilegedtrue \ …

OpenAi Q* (Q Star)项目入门介绍

为初学者解释 Open Ai 的 Q*(Q Star) Q* 的两个可能来源。 1)Q 可能是指 "Q-learning",这是一种用于强化学习的机器学习算法。 Q 名称的由来*:把 "Q*"想象成超级智能机器人的昵称。 Q 的意思是这个机器人非常善于做决定。 它从经验中学习,就像你从玩…

什么是数据填报?

数据填报是报表用以满足用户提出的灵活报送数据的需求&#xff0c;能快速开发各类数据采集系统的专业功能。多源填报模型&#xff0c;可实现数据的多源抽取与多源回填&#xff0c;在同一张填报表上实现数据提交至多个不同的数据表、数据库。 随着业务快速变化和扩大&#xff0c…