图片的四种灰度化方式openCV

title: 图片的四种灰度化方式
author: BbiHH
tags:

  • Naoqi机器人
    categories:
  • openCV
  • 图片变化
    date: 2019-08-20 15:07:00

(原创)

图片灰度化

灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有分量法 最大值法平均值法加权平均法四种方法对彩色图像进行灰度化。灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素最下为0,为黑色)。

现在大部分的彩色图像都是采用RGB颜色模式,处理图像的时候,要分别对RGB三种分量进行处理,实际上RGB并不能反映图像的形态特征,只是从光学的原理上进行颜色的调配。现在有很多其他的颜色模式,例如HSI模式,HSI是由色调,饱和度,亮度三个分量来表示颜色。HSI比RGB更符合人的视觉特性。但是HSI也是三通道,真正反映图像特征的变量是I,其他都是色彩的反映。所以我们经常要把图像弄成8位的灰度值图像直接进行处理,可以通过直方图,灰度变化,还有正交变换之类的进行处理。甚至经常把图像分割之后变成二值图像处理。

下面介绍图片灰度变化的方法。

图片灰度化的四种方式:
  • 直接取 BGR三分量值 为其强度值

代码演示:

#coding=utf-8

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)

# 直接取分量
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2


cv2.imshow('灰度图-分量b',b)
cv2.imshow('灰度图-分量g',g)
cv2.imshow('灰度图-分量r',r)

  • 取最大值法

R=G=B=max(R,G,B)

代码示例:

#coding=utf-8

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)

MaxGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    MaxGary[i,j] = max(img[i,j][0],img[i,j][1],img[i,j][2])
cv2.imshow('灰度图-最大取法',MaxGary)
  • 取平均值

R=G=B = (R+B+G)/3 将三通道分量的颜色值相加取平均值

代码实例:

 #coding=utf-8

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)
 
 NolGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    NolGary[i,j] = (int)((img[i,j][0]+img[i,j][1]+img[i,j][2])/3)
cv2.imshow('灰度图-平均值法',NolGary)
  • 加权平均值

按照一定的权值,对R,G,B的值加权平均。 由于人眼对绿色最为敏感,红色次之,蓝色的敏感性最低,因此权值 wG>wR>wB将得到较易识别的灰度图像。一般,wB=0.114,wG=0.578,wR=0.299 得到的灰度图像效果最好。

代码实例:

#coding=utf-8

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)

PeoGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    PeoGary[i,j] = 0.114*img[i,j][0] + 0.578 *img[i,j][1] + 0.299 *img[i,j][2]
cv2.imshow('灰度图-加权平均值法',PeoGary)

四种方法总和:

#coding=utf-8

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)

# 直接取分量
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]


cv2.imshow('灰度图-分量b',b)
cv2.imshow('灰度图-分量g',g)
cv2.imshow('灰度图-分量r',r)


# 取最大值
MaxGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    MaxGary[i,j] = max(img[i,j][0],img[i,j][1],img[i,j][2])
cv2.imshow('灰度图-最大取法',MaxGary)

# 平均法
NolGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    NolGary[i,j] = (int)((img[i,j][0]+img[i,j][1]+img[i,j][2])/3)
cv2.imshow('灰度图-平均值法',NolGary)

# 加权平均法
PeoGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    PeoGary[i,j] = 0.114*img[i,j][0] + 0.578 *img[i,j][1] + 0.299 *img[i,j][2]
cv2.imshow('灰度图-加权平均值法',PeoGary)

cv2.imshow('原图',img)
cv2.waitKey(0)

效果比较

原图
在这里插入图片描述
通道B
在这里插入图片描述
通道G
在这里插入图片描述
通道R
在这里插入图片描述
最大值
在这里插入图片描述
平均值
在这里插入图片描述
加权平均值
在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值