torch.histc()用法

torch.histc用于计算张量的直方图,将元素分到指定范围的等宽区间。在语义分割问题中,它可以用来统计模型预测与标签匹配的像素个数。例如,对于pred和label特征图,histc可以计算每个类别的像素匹配数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

torch.histc(input, bins, min, max)

1、定义
计算一个张量的直方图。

张量中的元素被分到min和max之间的等宽bins区间中,如果min和max都为0,则使用张量中所有元素的最小值和最大值。

小于min和大于max的元素将被忽略。

2、参数
input (Tensor) – the input tensor
bins (int) – number of histogram bins
min (Scalar) – lower end of the range (inclusive)
max (Scalar) – upper end of the range (inclusive)
返回:用张量表示的直方图

3、用例

import torch
 
data = torch.tensor([1., 1, 2, 2, 2, 5, 8])
area_intersect = torch.histc(data, bins=5, min=0, max=9)
print(area_intersect)

输出:

tensor([2., 3., 1., 0., 1.])

注意,输入不能是int类型,因此第一个元素初始化为float了

这里的含义是把[0, 9]区间均分为5个子区间,统计输入中的元素落在每个子区间里的个数。这里2个1落在[0, 1],3个2落在[2, 3],5落在[4, 5],[6, 7]中没有元素,8落在[8, 9]中,因此结果就是[2, 3, 1, 0, 1]

4、实际应用场景
在语义分割模型中,模型的输出pred是一个单通道的特征图,gt标签label也是一个单通道的特征图,其中每个位置的像素值是该位置所属的类别。下面的代码计算的是每个类别预测对的像素个数。

intersect = pred[pred == label]
area_intersect = torch.histc(
        intersect.float(), bins=(num_classes), min=0, max=num_classes - 1)
### 实现直方图均衡化技术 在计算机视觉领域,直方图均衡化是一种用于增强图像对比度的技术[^1]。虽然OpenCV提供了便捷的方法来执行此操作,但在某些情况下可能希望利用PyTorch框架的优势来进行处理。 为了在PyTorch中实现直方图均衡化,可以采用以下方法: #### 方法一:转换至NumPy并调用OpenCV函数 由于PyTorch本身并不直接支持直方图均衡化功能,一种解决方案是先将张量数据转为NumPy数组形式,接着应用OpenCV库中的`cv2.equalizeHist()`函数完成直方图均衡化后再变回PyTorch张量继续后续计算流程。 ```python import cv2 import torch import numpy as np def pytorch_hist_equalize(tensor_image): # 将tensor转换成numpy array img_np = tensor_image.squeeze().cpu().detach().numpy() # 应用opencv的equalizeHist函数 eq_img_np = cv2.equalizeHist((img_np * 255).astype(np.uint8)) # 转换回tensor eq_tensor = torch.from_numpy(eq_img_np.astype(np.float32)) / 255 return eq_tensor.unsqueeze(0) # 使用示例 image_tensor = torch.rand((1, 256, 256), dtype=torch.float32) # 创建随机灰度图片作为测试输入 enhanced_image = pytorch_hist_equalize(image_tensor) ``` 这种方法简单易行,适合于不需要完全依赖纯PyTorch环境的应用场景。 #### 方法二:自定义实现基于累积分布函数(CDF) 另一种更深入的方式是在不借助外部库的情况下,在PyTorch内部通过编程方式模拟直方图均衡化的原理——即根据像素强度值构建CDF曲线,并据此调整原始图像亮度分布。 ```python import torch def histeq_torch(img_gray, number_bins=256): # 计算直方图 histogram = torch.histc(img_gray, bins=number_bins) # 归一化得到概率密度函数PDF pdf = histogram / (img_gray.numel()) # 构建累计分布函数CDF cdf = pdf.cumsum(dim=-1) # 对原图进行映射变换 transformed = ((cdf[(img_gray*255).long()] * 255)).float() / 255 return transformed.view_as(img_gray) # 测试代码片段 gray_scale_image = torch.randint(low=0, high=256, size=(1, 256, 256), dtype=torch.float)/255. resulting_image = histeq_torch(gray_scale_image) ``` 上述两种方案均可有效提升图像质量,具体选择取决于实际需求以及项目对于第三方依赖的态度等因素考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值