cv2函数实践-图像处理(中心外扩的最佳RoI/根据两个坐标点求缩放+偏移后的RoI/滑窗切片/VOC的颜色+调色板)

本文主要是介绍cv2函数实践-图像处理(中心外扩的最佳RoI/根据两个坐标点求缩放+偏移后的RoI/滑窗切片/VOC的颜色+调色板),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录💨💨💨

    • 中心外扩的最佳RoI(裁图)
    • 根据两个坐标点求缩放+偏移后的RoI
    • 自定义RGB2BGR颜色解析小函数
    • 滑窗切片(sliding window crops)
    • VOC的颜色+调色板

中心外扩的最佳RoI(裁图)

指定中心点和裁图宽高,获得裁图位置xyxy坐标(最佳),便于在图像裁剪。

def get_best_crop_position_of_center(center_xy, img_w, img_h, crop_w, crop_h):pt = center_xyx0, y0 = max(0, pt[0] - crop_w // 2), max(0, pt[1] - crop_h // 2)  # 左上角 >= (0,0)x1, y1 = min(x0 + crop_w, img_w), min(y0 + crop_h, img_h)  # 右下角return [int(x1-crop_w), int(y1-crop_h), int(x1), int(y1)]

根据两个坐标点求缩放+偏移后的RoI

def get_xyxy_scale_shift(pt1, pt2, scale_xy=1.0, shift=0, imgW=0, imgH=0):"""给定两个坐标点,返回缩放+偏移后的RoI坐标:param pt1, pt2: 两个坐标点:param scale_xy: 缩放比例,还原到原图:param shift: 短边的放大偏移量(长边不变):param imgW: RoI坐标限宽:param imgH: RoI坐标限高"""x0, y0, x1, y1 = min(pt1[0], pt2[0]), min(pt1[1], pt2[1]), max(pt1[0], pt2[0]), max(pt1[1], pt2[1])  # 左上, 右下x0, y0, x1, y1 = round(x0 * scale_xy), round(y0 * scale_xy), round(x1 * scale_xy), round(y1 * scale_xy)  # 缩放,取整if x1 - x0 == y1 - y0:x0, x1 = x0 - shift, x1 + shifty0, y1 = y0 - shift, y1 + shiftelif x1 - x0 < y1 - y0:x0, x1 = x0 - shift, x1 + shiftelse:y0, y1 = y0 - shift, y1 + shiftif imgW > 0:x0 = min(max(0, x0), imgW)x1 = min(max(0, x1), imgW)if imgH > 0:y0 = min(max(0, y0), imgH)y1 = min(max(0, y1), imgH)return int(x0+0.5), int(y0+0.5), int(x1+0.5), int(y1+0.5)

上面函数可以应用在图像上画矩形框,

def draw_RoI(img: np.ndarray, pt1, pt2, scale_xy=1.0, shift=0, color=None, thickness=None):if color is None: color = (0,255,0)imgH, imgW = img.shape[:2]x0, y0, x1, y1 = get_xyxy_scale_shift(pt1, pt2, scale_xy, shift, imgW, imgH)cv2.rectangle(img, (x0, y0), (x1, y1), color, thickness)return x0, y0, x1, y1

自定义RGB2BGR颜色解析小函数

def rgb2bgr(rgb):if isinstance(rgb, (list, tuple)):rgb_list = []for val in rgb:if isinstance(val, str) and val.strip() != '':rgb_list.append(int(val.strip()))elif isinstance(val, int):rgb_list.append(val)return rgb_list[::-1]elif isinstance(rgb, str):bgr = [int(val.strip()) for val in rgb.split(',') if val.strip() != ''][::-1]return bgrelse:raise ValueError("error in converting RGB[" + str(rgb) + "] to BGR")

滑窗切片(sliding window crops)

指定横向和纵向的Windows数,自适应计算每个Window的宽和高,以及滑窗步长,居中对齐,返回每个Window的坐标。

def make_grids(img, grid_x, grid_y, dx=0, dy=0):"""make grids in x-axis and y-axis指定横向和纵向的Windows数,自适应计算每个Window的宽和高,居中对齐,返回每个Window的坐标Args:img: ndarraygrid_x: number of grids in x-axis,指定横向窗口数grid_y: number of grids in y-axis,指定纵向窗口数dx: shrinking size in x-axis,横向窗口间隔的一半dy: shrinking size in y-axis,纵向窗口间隔的一半Returns:[[grid_box]], wheregrid_box = (upleft_pt, downright_pt) = ((x0, y0), (x1, y1))"""grid_boxs = []h, w = img.shape[:2]left_pad, up_pad = (w % grid_x) // 2, (h % grid_y) // 2box_w, box_h = w // grid_x, h // grid_yfor hi in range(grid_y):row_boxs = [((left_pad+wi*box_w+dx, up_pad+hi*box_h+dy),(left_pad+(wi+1)*box_w-dx, up_pad+(hi+1)*box_h-dy))for wi in range(grid_x)]grid_boxs.append(row_boxs)return grid_boxsdef make_grids_sliding(img, grid_x, grid_y, box_w, box_h):"""指定横向和纵向的Windows数 以及窗口大小,有overlapping的滑窗,左右上下紧贴边Args:img: ndarraygrid_x: number of grids in x-axis,指定横向窗口数grid_y: number of grids in y-axis,指定纵向窗口数box_w: width of each box,窗口横向宽度box_h: height of each box,窗口纵向高度Returns:[[grid_box]], wheregrid_box = (upleft_pt, downright_pt) = ((x0, y0), (x1, y1))Examples:[:append]grid_boxs = make_grids_sliding(srcImg, 4, 3, 1280, 1280)for idy, row_boxs in enumerate(grid_boxs):for idx, ((x0, y0), (x1, y1)) in enumerate(row_boxs):cv2.circle(srcImg, ((x0+x1)//2, (y0+y1)//2), 20, color, -1)[:extend]grid_boxs = make_grids_sliding(srcImg, 4, 3, 1280, 1280)for (x0, y0), (x1, y1) in grid_boxs:cv2.circle(srcImg, ((x0+x1)//2, (y0+y1)//2), 20, color, -1)"""grid_boxs = []h, w = img.shape[:2]# box_h, box_w = min(h, box_h), min(w, box_w)  # 保证:窗口大小 <= 原图大小lt_x0y0, rd_x0y0 = (0, 0), (max(0, w-box_w), max(0, h-box_h))  # 左上角窗口、右下角窗口的左上角坐标x0linspace = [int(x0) for x0 in np.linspace(lt_x0y0[0], rd_x0y0[0], grid_x)]y0linspace = [int(y0) for y0 in np.linspace(lt_x0y0[1], rd_x0y0[1], grid_y)]for y0 in y0linspace:row_boxs = [((x0, y0), (x0+box_w, y0+box_h))for x0 in x0linspace]  # 左上角、右下角grid_boxs.extend(row_boxs)  # .appendreturn grid_boxsif __name__ == '__main__':srcImg = np.zeros((2000, 2000, 3), dtype=np.uint8)grid_boxs = make_grids_sliding(srcImg, 2, 2, 1280, 1280)print(grid_boxs)# 在crop_srcImg上滑动窗口裁图,将grid_boxs从crop_srcImg映射回srcImgpx0, py0 = 10, 10for idy, row_boxs in enumerate(grid_boxs):(x0, y0), (x1, y1) = row_boxsgrid_boxs[idy] = ((x0 + px0, y0 + py0), (x1 + px0, y1 + py0))print(grid_boxs)

VOC的颜色+调色板

通过位运算,巧妙地生成有梯度(相差128个灰度值)的RGB颜色表,相比打表可快多了。


def create_pascal_label_colormap():"""PASCAL VOC 分割数据集的类别标签颜色映射label colormap返回:可视化分割结果的颜色映射ColormapExamples:colormap = create_pascal_label_colormap()color = colormap[idx].tolist()  # [b, g, r]# 分割结果label.shape=(1024,1024),渲染图vis.shape=(1024,1024,3)vis = colormap[label]"""colormap = np.zeros((256, 3), dtype=int)ind = np.arange(256, dtype=int)for shift in reversed(range(8)):for channel in range(3):colormap[:, channel] |= ((ind >> channel) & 1) << shiftind >>= 3return colormap

这篇关于cv2函数实践-图像处理(中心外扩的最佳RoI/根据两个坐标点求缩放+偏移后的RoI/滑窗切片/VOC的颜色+调色板)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026225

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam