灰度图像的生成

       由于毕业设计要做关于计算机视觉的题目,因此不可避免的要学习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()


方法二:对RGB三个通道的值取平均值,可以直接进行线性平均,也可以进行加权平均,还可以去三个通道中的最大值。总之,这是一种对于每个像素点三个通道进行操作的一种方法。这里要注意一点,我所采用的图像的深度是uint8类型,由于uint8的范围太小,加和时一定会溢出,所以要提前一步进行数据转换,然后再变回uin8t类型。代码中双重循环对图像进行遍历,三种操作对应着相应的代码。

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()

方法三:直接利用cvtcolor函数进行操作,可以在不同颜色空间之间进行转换。

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()



你可能感兴趣的:(灰度图像的生成)