Error: OpenCV, Unsupported depth of input image

Error: OpenCV, Unsupported depth of input image

我想创建一个随机改变图片亮度的函数。

我有这个导入:

import math
import random
import numpy as np

import cv2
from PIL import Image
import matplotlib.pyplot as plt
from matplotlib.colors import Colormap
from mpl_toolkits.axes_grid1 import ImageGrid

from io import BytesIO
from google.colab import files

然后我将图像上传到我的 google colab 工作区:

uploaded = files.upload()
im = Image.open(BytesIO(uploaded['aug_cat.jpg']))
plt.imshow(im)
plt.show()

然后我得到 this picture。然后我这样做是为了将我的图像转换成浮点数:

img = cv2.imread('aug_cat.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = img.astype(float) / 255

最后我尝试使用这个功能:

def aug_bright(img, factor = random.uniform(-10, 10)):
  hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
  hsv = np.array(hsv, dtype=np.float64)
  hsv[:, :, 2] = hsv[:, :, 2] * (factor)
  hsv[:, :, 2][hsv[:, :, 2] > 255] = 255 
  img = cv2.cvtColor(cv2.UMat(im), cv2.COLOR_HSV2RGB)
  return img

我尝试调用这个函数并显示结果:

bright_img = aug_bright(img)
plt.imshow(bright_img)
plt.show()

但是我有这个错误:

error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/color.simd_helpers.hpp:94: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<3, 4>; VDcn = cv::impl::{anonymous}::Set<3>; VDepth = cv::impl::{anonymous}::Set<0, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = (cv::impl::<unnamed>::SizePolicy)2u; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]'
> Unsupported depth of input image:
>     'VDepth::contains(depth)'
> where
>     'depth' is 6 (CV_64F)

我该如何解决?有什么问题?

你为什么不用ImageEnhance method?通过 factor 你可以改变图像的亮度。例如

from PIL import Image, ImageEnhance

#read the image
im = Image.open("sample-image.png")

#image brightness enhancer
enhancer = ImageEnhance.Brightness(im)

factor = 1 #gives original image
im_output = enhancer.enhance(factor)
im_output.save('original-image.png')

factor = 0.5 #darkens the image
im_output = enhancer.enhance(factor)
im_output.save('darkened-image.png')

factor = 1.5 #brightens the image
im_output = enhancer.enhance(factor)
im_output.save('brightened-image.png')

所以我的任务是编写自己的函数,这就是为什么我没有使用一些支持库的原因。

我已经这样解决了我的问题。

首先,我的进口:

import math
import random
import numpy as np

import cv2
from PIL import Image
import matplotlib.pyplot as plt
from matplotlib.colors import Colormap
from mpl_toolkits.axes_grid1 import ImageGrid

from io import BytesIO
from google.colab import files

其次,一些google colab 下载和数据准备:

uploaded = files.upload()
im = Image.open(BytesIO(uploaded['aug_cat.jpg']))
img = cv2.imread('aug_cat.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = img.astype(np.float32, copy=False)
imgUMat = np.float32(img)

第三,我的自定义函数:

def aug_bright(imgUMat, factor = random.uniform(-10, 10)):
  """
  Random brightness change
  """
  hsv = cv2.cvtColor(imgUMat, cv2.COLOR_RGB2HSV)
  hsv = np.array(hsv, dtype=np.float32)
  hsv[:, :, 2] = hsv[:, :, 2] * (factor)
  hsv[:, :, 2][hsv[:, :, 2] > 255] = 255 
  imgUMat = cv2.cvtColor(cv2.UMat(imgUMat), cv2.COLOR_HSV2RGB)
  return img

我是这样称呼它的:

bright_img = aug_bright(imgUMat)
plt.imshow(bright_img)
plt.show()

希望我的回答对大家有用。