从两张图像求平均说起-python中的uint8

从两张图像求平均说起-python中的uint8

前段时间需要对三张图像求平均,这本来是个跟简单的问题,但是做着做着确出现了一个问题…

0. 求平均v1

import numpy as np
import cv2
data1 = cv2.imread("a.png")
data2 = cv2.imread("a.png")
cv2.imwrite("b.png",(data1+data2)/2)

其中a.png是一张全白的照片,里面全部都是255,按照我的想法,那平均一下应该还是全白,因为(255+255)/2 还是255,但是出来的结果确让我大跌眼睛,竟然变成了灰色的了,这就emm…

并且对平均后的数据输出发现全部都是127,那这是哪里出了问题呢。

后来我在网上看到别人求平均,代码如下:

import numpy as np
import cv2
data1 = cv2.imread("a.png").astype(np.float)
data2 = cv2.imread("a.png").astype(np.float)
print((data1+data2)/2)
cv2.imwrite("b.png",(data1+data2)/2)

看到这里我就有点明白了,忽然想起来了,很久之前的时候,听说过opencv读取的数据类型是uint8,到这里就大概明白了,之前的代码之所以有问题,是因为数据溢出了,uint8类型最大只能存储到256个数值[0,255],超过的部分就被截取了,因此我原先的data1+data2计算得到是510>255,所以就截断了,因此变为510%256 = 254,然后再除2就变成127了。

1. 求平均v2

因此改进后的代码如下:

import numpy as np
import cv2
data1 = cv2.imread("a.png").astype(np.float)
data2 = cv2.imread("a.png").astype(np.float)
print((data1+data2)/2)
cv2.imwrite("b.png",(data1+data2)/2)
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python,可以使用两种方法将uint16类型的数据转换为uint8类型的数据。 方法一是直接使用`np.uint8()`函数进行转换。首先导入`cv2`和`numpy`库,然后读取uint16的图像数据。接下来使用`np.uint8()`函数将uint16图像数据转换为uint8类型的数据。具体代码如下所示: ```python import cv2 import numpy as np path = 'uint16_img.png' uint16_img = cv2.imread(path, cv2.IMREAD_UNCHANGED) uint8_img = np.uint8(uint16_img) ``` 方法二是将图片等比例缩放到0-255之间,然后再转换为uint8类型的数据。同样需要导入`cv2`和`numpy`库,并读取uint16的图像数据。然后将图像数据减去最小值,并将图像数据除以最大值减去最小值,再乘以255,将图像数据缩放到0-255之间。最后再使用`np.uint8()`函数将图像数据转换为uint8类型的数据。具体代码如下所示: ```python import cv2 import numpy as np path = 'uint16_img.png' uint16_img = cv2.imread(path, cv2.IMREAD_UNCHANGED) uint16_img -= uint16_img.min() uint16_img = uint16_img / (uint16_img.max() - uint16_img.min()) uint16_img *= 255 uint8_img = np.uint8(uint16_img) ``` 这两种方法都可以将uint16类型的数据转换为uint8类型的数据。具体使用哪种方法,可以根据自己的需和实际情况选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [uint16数据的读取以及转换为uint8数据显示](https://blog.csdn.net/fuleileileilei/article/details/127726707)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Python 改变数组类型为uint8的实现](https://download.csdn.net/download/weixin_38546024/12853472)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值