图片的四种灰度化方式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)

效果比较

原图
图片的四种灰度化方式openCV_第1张图片
通道B
图片的四种灰度化方式openCV_第2张图片
通道G
图片的四种灰度化方式openCV_第3张图片
通道R
图片的四种灰度化方式openCV_第4张图片
最大值
图片的四种灰度化方式openCV_第5张图片
平均值
图片的四种灰度化方式openCV_第6张图片
加权平均值

你可能感兴趣的:(NAOqi开发日记,opencv,计算机视觉,rgb)