图像处理(一)图像灰度化的三种方式

  图像处理的第一步操作基本都是进行灰度化,二灰度化的方式都很多种,可以根据自己的具体需要进行参数调整,基本分为四大种,分别为YUV亮度灰度化最大值灰度化平均值灰度化Gamma校正灰度化
1.Gamma校正灰度化
原理如下计算公式:
             G r a y = R 2.2 + ( 1.5 G ) 2.2 + ( 0.6 B ) 2.2 1 + 1. 5 2.2 + 0. 6 2.2 2.2 Gray=\sqrt[2.2]{\frac{R^{2.2}+(1.5G)^{2.2}+(0.6B)^{2.2}}{1+1.5^{2.2}+0.6^{2.2}}} Gray=2.21+1.52.2+0.62.2R2.2+(1.5G)2.2+(0.6B)2.2
  注意这里的2.2次方和2.2次方根,RGB颜色值不能简单直接相加,而是必须用2.2次方换算成物理光功率。因为RGB值与功率并非简单的线性关系,而是幂函数关系,这个函数的指数称为Gamma值,一般为2.2,而这个换算过程,称为Gamma校正。

import cv2
import numpy as np
import math
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文

def Gamma_GRAY(picture_path):  #Gamma校正灰度化:Gray=
    # 读取图像
    img = cv2.imread(picture_path)
    # 获取图像尺寸
    h, w = img.shape[0:2]
    # 自定义空白单通道图像,用于存放灰度图
    gray = np.zeros((h, w), dtype=img.dtype)
    # 对原图像进行遍历,然后分别对B\G\R按比例灰度化
    for i in range(h):
        for j in range(w):
            a = img[i, j, 2] ** (2.2) + 1.5 * img[i, j, 1] ** (2.2) + 0.6 * img[i, j, 0] ** (2.2)  # 分子
            b = 1 + 1.5 ** (2.2) + 0.6 ** (2.2)  # 分母
            gray[i, j] = pow(a / b, 1.0 / 2.2)  # 开2.2次方根
    gray = cv2.cvtColor(gray, cv2.COLOR_BGR2RGB)  # BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
    plt.imshow(gray)
    plt.title('Gamma校正灰度化')
    plt.axis('off')  # 关闭坐标轴  设置为on则表示开启坐标轴
    plt.show()  # 显示图像

2.平均值灰度化
原理: 对B、G、R三通道像素求取平均值作为灰度值,公式为:
             g r a y = ( B + G + R ) / 3 gray=(B+G+R)/3 gray=(B+G+R)/3

def Avrage_GRAY(picture_path):  #平均值灰度化:对B、G、R三通道像素求取平均值作为灰度值,公式为:gray=(B+G+R)/3
    # 读取图像
    img = cv2.imread(picture_path)
    # 获取图像尺寸
    h, w = img.shape[0:2]
    # 自定义空白单通道图像,用于存放灰度图
    gray = np.zeros((h, w), dtype=img.dtype)
    # 对原图像进行遍历,然后分别对B\G\R按比例灰度化
    for i in range(h):
        for j in range(w):
            gray[i, j] = (int(img[i, j, 0]) + int(img[i, j, 1]) + int(img[i, j, 2])) / 3  # 求3通道像素的平均值作为灰度值
    gray = cv2.cvtColor(gray, cv2.COLOR_BGR2RGB)  # BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
    plt.imshow(gray)
    plt.title('平均值灰度化')
    plt.axis('off')  # 关闭坐标轴  设置为on则表示开启坐标轴
    plt.show()  # 显示图像

3.最大值灰度化
原理:以B、G、R通道中最大的像素作为整体像素,公式为:
             B = G = R = m a x ( [ B , G , R ] ) B=G=R=max([B,G,R]) B=G=R=max([B,G,R])

def Max_GRAY(picture_path):  #最大值灰度化:以B、G、R通道中最大的像素作为整体像素,公式为:B=G=R=max([B,G,R])
    #读取图像
    img = cv2.imread(picture_path)
    # 获取图像尺寸
    h, w = img.shape[0:2]
    # 自定义空白单通道图像,用于存放灰度图
    gray = np.zeros((h, w), dtype=img.dtype)
    # 对原图像进行遍历,然后分别对B\G\R按比例灰度化
    for i in range(h):
        for j in range(w):
            gray[i, j] = max(img[i, j, 0], img[i, j, 1], img[i, j, 2])  # 求3通道中最大的值
    gray = cv2.cvtColor(gray, cv2.COLOR_BGR2RGB)  # BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
    plt.imshow(gray)
    plt.title('最大值灰度')
    plt.axis('off')  # 关闭坐标轴  设置为on则表示开启坐标轴
    plt.show()  # 显示图像

4.YUV亮度灰度化
原理:根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应,以这个亮度值表达图像的灰度值。公式为:
             Y = 0.3 R + 0.59 G + 0.11 B Y=0.3R+0.59G+0.11B Y=0.3R+0.59G+0.11B

def Cv2_GRAY(picture_path):  # YUV亮度灰度处理:Y=0.3R+0.59G+0.11B
  	#读取图像
    img=cv2.imread(picture_path)
    gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#BGR转换为灰度
    print(gray.shape)
    img= cv2.cvtColor(gray,cv2.COLOR_BGR2RGB)#BGR转换为RGB显示格式
    plt.imshow(img)
    plt.title('灰度处理')
    plt.axis('off')#关闭坐标轴  设置为on则表示开启坐标轴
    plt.show()#显示图像
    return gray

你可能感兴趣的:(Opencv系列,计算机视觉,opencv,图像处理)