由于毕业设计要做关于计算机视觉的题目,因此不可避免的要学习Opencv,我一开始学的Python接口的版本,不过也看了有关于c语言和c++接口的一些资料,opencv大部分代码都是基于c编写的,因此如果看c的接口可以很方便的追踪到其中的数据结构的定义和原函数一些声明和参数定义,但是我本人觉得不足之处是c或者c++本身就不是处理矩阵的一种编程语言,因此学会有一定的难度。我之前接触过python的numpy,因此认为还比较容易上手,这个模块是专门为科学计算而生的,用起来很像matlab,但是又更接近于规范的编程语言。
一些图像的载入和显示部分就先略去不谈了,由于目前纠结在用哪种风格的接口函数中,我有强迫症,先让我静静.......
这里主要记录一下如何做彩色图像的灰度变换。
方法一:分解原图像的三个通道,每个通道就会生成出一个灰度图像。这里也有两种方法,一个是利用opencv自带的函数split,第二种方法是单独遍历出每一个通道,建立新的图像。代码如下:
def RGB2Gray(fileName = 'a.jpg'): img = cv2.imread(fileName) m = img.shape[0] n = img.shape[1] b = np.zeros((m,n),img.dtype) g = np.zeros((m,n),img.dtype) r = np.zeros((m,n),img.dtype) b,g,r = cv2.split(img) cv2.imshow('grayb',b) cv2.imshow('grayr',r) cv2.imshow('grayg',g) cv2.waitKey() cv2.destroyAllWindows() def RGB2Gray2(fileName = 'a.jpg'): img = cv2.imread(fileName) m = img.shape[0] n = img.shape[1] b = np.zeros((m,n),img.dtype) g = np.zeros((m,n),img.dtype) r = np.zeros((m,n),img.dtype) b[:,:] = img[:,:,0] g[:,:]= img[:,:,1] r[:,:] = img[:,:,2] cv2.imshow('grayb',b) cv2.imshow('grayr',r) cv2.imshow('grayg',g) cv2.waitKey() cv2.destroyAllWindows()
def RGB2gray(fileName = 'a.jpg'): img = cv2.imread(fileName) cv2.imshow('img',img) m = img.shape[0] n = img.shape[1] channelNum = img.shape[2] newImg = np.zeros((m,n),dtype = img.dtype) #数据类型需要与原图一致,这里为uint8 for i in range(m): for j in range(n): #newImg[i,j] = np.uint8((float(img[i,j][0])+float(img[i,j][1])+float(img[i,j][2]))/3) #newImg[i,j] = max(img[i,j,0],img[i,j,1],img[i,j,2]) newImg[i,j] = 0.3 * img[i,j][0] + 0.59 * img[i,j][1] + 0.11 * img[i,j][2] cv2.imshow('gray', newImg) cv2.waitKey(0) cv2.destroyAllWindows()
def easyWay(fileName = 'a.jpg'): img = cv2.imread(fileName) #gray = np.zeros((img.shape[0],img.shape[1]),np.uint8) gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) cv2.imshow('gray',gray) cv2.waitKey() cv2.destroyAllWindows()