最近想用python实现canny算法,第一步把彩色图片转换为灰度图片的时候就出现问题(orz,我真是太菜了),首先我们来回顾下灰度化的原理。
彩色图像是由RGB三个分量决定的,每幅图像有三个通道。每个分量的范围是[0,255],因此读取图像后返回的数据类型是unit8。当R=G=B(三种颜色分量值相同时),则此时彩色表示一种灰度颜色,其中R=G=B的值叫做灰度值,灰度化的方法有四种:均值法、最大值法、分量法、加权平均法,灰度化处理后每个像素点便只有一个亮度值了。
代码参考的是:
Python图像处理(一)【灰度化、二值化、灰度变换】_lzwarhang的博客-博客 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)就成功啦~~