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)把图像转化为了<class 'PIL.Image.Image'>,并不能在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
输出两种处理后各元素的数据类型
于是加入代码:

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

就成功啦~~
赫敏真好看啊~~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值