zoukankan      html  css  js  c++  java
  • 挑战图像处理100问(2)——灰度化

    在这里插入图片描述
    读取图像,然后将彩色图像进行灰度化。
    Author: Tian YJ
    原图如下:

    在这里插入图片描述

    关于灰度图

    灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255黑色为0所谓灰度值是指色彩的浓淡程度,灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象素数。

    灰度就是没有色彩,RGB色彩分量全部相等。如果是一个二值灰度图象,它的象素值只能为0或1,我们说它的灰度级为2。用个例子来说明吧:一个256级灰度的图象,如果RGB三个量相同时,如:RGB(100,100,100)就代表灰度为100,RGB(50,50,50)代表灰度为50。

    现在大部分的彩色图像都是采用RGB颜色模式,处理图像的时候,要分别对RGB三种分量进行处理,实际上RGB并不能反映图像的形态特征,只是从光学的原理上进行颜色的调配。

    图像灰度化处理可以作为图像处理的预处理步骤,为之后的图像分割、图像识别和图像分析等上层操作做准备。


    灰度化处理方式
    1. 分量法
      将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。
      Gray1(i,j)=R(i,j)Gray_1(i,j)=R(i,j)
      Gray2(i,j)=G(i,j)Gray_2(i,j)=G(i,j)
      Gray3(i,j)=B(i,j)Gray_3(i,j)=B(i,j)
    """
    AUTHOR: Tian YJ
    CREATE: 2020-4-6
    FUNCTION: BGR -> Gray
    """
    
    import cv2
    import numpy as np
    
    # 灰度化函数
    def BGR2GRAY(img):
    	b = img[:, :, 0].copy() # 蓝色通道
    	g = img[:, :, 1].copy() # 绿色通道
    	r = img[:, :, 2].copy() # 红色通道
    
    	# 灰度化(分别取r、g、b)
    	img[:, :, 0] = r 
    	img[:, :, 1] = r 
    	img[:, :, 2] = r 
    
    	out = img
    	out = out.astype(np.uint8)
    	return out
    	
    # 读取图片
    path = 'C:/Users/86187/Desktop/image/'
    
    
    file_in = path + 'cake.jpg' 
    file_out = path + 'BGR2GRAY_1.jpg' 
    img = cv2.imread(file_in)
    
    # 调用函数
    out = BGR2GRAY(img)
    
    # 保存图片
    cv2.imwrite(file_out, out)
    cv2.imshow("result", out)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    r分量 g分量 b分量
    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
    1. 最大值法
      将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。
      Gray(i,j)=max{R(i,j),G(i,j),B(i,j)}Gray(i,j)=max{R(i,j),G(i,j),B(i,j)}
    import cv2
    import numpy as np
    
    # 灰度化函数
    def BGR2GRAY(img):
    	
    	# 获取图片尺寸
    	H, W, C = img.shape
    
    	# 灰度化
    	out = np.ones((H,W,3))
    	for i in range(H):
    		for j in range(W):
    			out[i,j,:] = max(img[i,j,0], img[i,j,1], img[i,j,2])
    
    	out = out.astype(np.uint8)
    
    	return out
    # 读取图片
    path = 'C:/Users/86187/Desktop/image/'
    
    file_in = path + 'cake.jpg' 
    file_out = path + 'BGR2GRAY_4.jpg' 
    img = cv2.imread(file_in)
    
    # 调用函数
    out = BGR2GRAY(img)
    
    # 保存图片
    cv2.imwrite(file_out, out)
    cv2.imshow("result", out)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在这里插入图片描述

    1. 平均值法
      将彩色图像中的三分量亮度求平均得到一个灰度值。
      Gray(i,j)=(R(i,j)+G(i,j)+B(i,j))/3Gray(i,j)=(R(i,j)+G(i,j)+B(i,j))/3
    """
    AUTHOR: Tian YJ
    CREATE: 2020-4-6
    FUNCTION: BGR -> Gray
    """
    
    import cv2
    import numpy as np
    
    # 灰度化函数
    def BGR2GRAY(img):
    
    	# 获取图片尺寸
    	H, W, C = img.shape
    
    	# 灰度化
    	out = np.ones((H,W,3))
    	for i in range(H):
    		for j in range(W):
    			out[i,j,:] = (img[i,j,0]+img[i,j,1]+img[i,j,2])/3
    
    	out = out.astype(np.uint8)
    
    	return out
    
    
    # 读取图片
    path = 'C:/Users/86187/Desktop/image/'
    
    
    file_in = path + 'cake.jpg' 
    file_out = path + 'BGR2GRAY_5.jpg' 
    img = cv2.imread(file_in)
    
    # 调用函数
    out = BGR2GRAY(img)
    
    # 保存图片
    cv2.imwrite(file_out, out)
    cv2.imshow("result", out)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在这里插入图片描述

    1. 加权平均法
      根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。

    Gray(i,j)=0.299R(i,j)+0.578G(i,j)+0.114B(i,j)Gray(i,j)=0.299*R(i,j)+0.578*G(i,j)+0.114*B(i,j)

    """
    AUTHOR: Tian YJ
    CREATE: 2020-4-6
    FUNCTION: BGR -> Gray
    """
    
    import cv2
    import numpy as np
    
    # 灰度化函数
    def BGR2GRAY(img):
    
    	# 获取图片尺寸
    	H, W, C = img.shape
    
    	# 灰度化
    	out = np.ones((H,W,3))
    	for i in range(H):
    		for j in range(W):
    			out[i,j,:] = 0.299*img[i,j,0] + 0.578*img[i,j,1] + 0.114*img[i,j,2]
    
    	out = out.astype(np.uint8)
    
    	return out
    
    
    # 读取图片
    path = 'C:/Users/86187/Desktop/image/'
    
    
    file_in = path + 'cake.jpg' 
    file_out = path + 'BGR2GRAY_6.jpg' 
    img = cv2.imread(file_in)
    
    # 调用函数
    out = BGR2GRAY(img)
    
    # 保存图片
    cv2.imwrite(file_out, out)
    cv2.imshow("result", out)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在这里插入图片描述

  • 相关阅读:
    分布式缓存memcached介绍,win7环境安装,常用命令set,get,delete,stats, java访问
    【转】移除HTML5 input在type="number"时的上下小箭头
    ES6特性的两点分析
    hexo_config.yml配置内容
    JS性能分析(测试代码运行时间)
    github修改仓库项目的语言类型
    JavaScript回文数
    JS设计模式
    webpac入门
    居中问题
  • 原文地址:https://www.cnblogs.com/Jack-Tim-TYJ/p/12831926.html
Copyright © 2011-2022 走看看