python-opencv 实现灰度化(不用内置函数),出现问题: Expected cv::UMat for argument ‘mat‘

最近想用python实现canny算法,第一步把彩色图片转换为灰度图片的时候就出现问题(orz,我真是太菜了),首先我们来回顾下灰度化的原理。

原理

彩色图像是由RGB三个分量决定的,每幅图像有三个通道。每个分量的范围是[0,255],因此读取图像后返回的数据类型是unit8。当R=G=B(三种颜色分量值相同时),则此时彩色表示一种灰度颜色,其中R=G=B的值叫做灰度值,灰度化的方法有四种:均值法、最大值法、分量法、加权平均法,灰度化处理后每个像素点便只有一个亮度值了。

加权平均法代码

代码参考的是:

Python图像处理(一)【灰度化、二值化、灰度变换】_lzwarhang的博客-CSDN博客 https://blog.csdn.net/lzwarhang/article/details/93209166

但是文章中使用的是PIL包实现的灰度转化,我想完全基于opencv实现,这里需要注意的是,Image.fromarray(im)把图像转化为了,并不能在opencv里运用

代码:

import cv2
from PIL import Image
import numpy as np
#获取照片
img = cv2.imread('hm2.jpg')
im = np.array(img)
im[:,:,0] = im[:,:,0]*0.3
im[:,:,1] = im[:,:,1]*0.59
im[:,:,2] = im[:,:,2]*0.11
im = np.sum(im, axis=2)
#显示图像
cv2.imshow("hm_gray", im)
cv2.waitKey()

运行后发现出现错误:

Traceback (most recent call last):
  File "D:/python/myWorkSpace/color2gray.py", line 20, in <module>
    cv2.imshow("hm_gray", im)
TypeError: Expected cv::UMat for argument 'mat'

度娘了一波这个错误并没有得到答案,查看处理后的im类型:

<class 'numpy.ndarray'>

按道理来说ndarray类型在cv2中可以直接imshow出来,故与cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)处理后的返回的数组类型进行对比,发现维度一样而问题出在每个元素的dtype
python-opencv 实现灰度化(不用内置函数),出现问题: Expected cv::UMat for argument ‘mat‘_第1张图片
于是加入代码:

im = np.array(im,dtype=np.uint8)

就成功啦~~
python-opencv 实现灰度化(不用内置函数),出现问题: Expected cv::UMat for argument ‘mat‘_第2张图片

你可能感兴趣的:(opencv,python)