首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV -将uint8图像转换为float32标准化图像

OpenCV -将uint8图像转换为float32标准化图像
EN

Stack Overflow用户
提问于 2019-08-02 19:34:56
回答 2查看 13.6K关注 0票数 3

我正在尝试转换Keras DarkNet代码的一部分,以使代码运行得更快。下面是我正在尝试优化的代码:

代码语言:javascript
复制
model_image_size = (416, 416)

import cv2
from PIL import Image

frame = cv2.imread("test.png", cv2.IMREAD_COLOR)

im = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
im = Image.fromarray(im).crop((1625, 785, 1920, 1080))  # crop ROI

resized_image = im.resize(tuple(reversed(model_image_size)), Image.BICUBIC)
image_data = np.array(resized_image, dtype='float32')

image_data /= 255.
image_data = np.expand_dims(image_data, 0)  # Add batch dimension.

return image_data

这是我试图在不使用中间PIL转换来减少时间的情况下实现相同的输出:

代码语言:javascript
复制
model_image_size = (416, 416)

import cv2

frame = cv2.imread("test.png", cv2.IMREAD_COLOR)

frame = frame[785:1080,1625:1920]  # crop ROI
im = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

resized_image = cv2.resize(im, model_image_size, interpolation = cv2.INTER_CUBIC)

resized_image /= 255.
image_data = np.expand_dims(resized_image, 0)  # Add batch dimension.

return image_data

但是,在运行代码时,它将返回:

代码语言:javascript
复制
resized_image /= 255.
TypeError: ufunc 'true_divide' output (typecode 'd') could not be coerced to provided output parameter (typecode 'B') according to the casting rule ''same_kind''

在规范化之前,我似乎需要将uint8类型更改为float32,但我不确定如何使用OpenCV来实现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-02 21:49:21

您可以使用resized_image.astype(np.float32)resized_image数据从unit8转换为float32,然后进行规范化和其他操作:

代码语言:javascript
复制
frame = cv2.imread("yourfile.png")

frame = frame[200:500,400:1000]  # crop ROI
im = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

model_image_size = (416, 416)
resized_image = cv2.resize(im, model_image_size, interpolation = cv2.INTER_CUBIC)
resized_image = resized_image.astype(np.float32)
resized_image /= 255.

image_data = np.expand_dims(resized_image, 0)  # Add batch dimension.
票数 3
EN

Stack Overflow用户

发布于 2019-08-02 20:23:06

您的问题是使用/=对同一变量进行除法和赋值。Numpy期望当您这样做时,数组的类型与以前相同,但您使用的是一个浮点数除法,这将改变值类型。

要解决此问题,您可以执行以下操作:

代码语言:javascript
复制
resized_image =  resized_image / 255.

它应该是有效的。但您必须注意,它会将矩阵转换为dtype=float64。要将其转换为float32,您可以执行以下操作:

代码语言:javascript
复制
resized_image.astype(np.float32)

代码语言:javascript
复制
np.float32(resized_image)

np应该来自:

代码语言:javascript
复制
import numpy as np
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57325720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档