最近想用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
:
于是加入代码:
im = np.array(im,dtype=np.uint8)