图像灰度化

文章目录
  1. 1. 前言
  2. 2. 理论
  3. 3. 实践
    1. 3.1. 安装opencv
    2. 3.2. 简单灰度化
    3. 3.3. 分量法
    4. 3.4. 最大值法
    5. 3.5. 平均值法
    6. 3.6. 加权平均法
  4. 4. 后记
  5. 5. 书签

前言

离研究生毕业只有六个月了,毕业设计也该动手了。去年开题,选择了《基于图像处理的客观题自动阅卷系统的设计与实现》这个题目。今年中期,考虑了很久,最终还是没有换题目。想要做AIOps,但是自己基础薄弱,也没有特定的方向,到了六月份也不一定能完成。保险起见,还是做阅卷系统吧!

阅卷系统主要有五个方面的研究内容,分别是图像预处理、目标检测、图像分割、手写识别和移动Web。其中图像预处理包括试卷图像的灰度化、二值化、去噪、倾斜矫正等;目标检测是为了定位学号和答案的位置,并且提取出这些信息;图像分割是为了分割学号和多选题的字符;手写识别是为了识别手写字符,包括数字和字母;移动Web是为了方便老师随时随地使用系统。

本文,就来研究一下图像的灰度化。

理论

在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有以下四种方法对彩色图像进行灰度化:

1、分量法
将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。f1(i,j)=R(i,j) f2(i,j)=G(i,j) f3(i,j)=B(i,j) 其中fk(i,j)(k=1,2,3)为转换后的灰度图像在(i,j)处的灰度值。

2、最大值法   
将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。f(i,j)=max(R(i,j),G(i,j),B(i,j))

3、平均值法   
将彩色图像中的三分量亮度求平均得到一个灰度图。f(i,j)=(R(i,j)+G(i,j)+B(i,j))/3

4、加权平均法   
根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))

更多内容参考图像分析

实践

算法的实现,主要参考Python下OpenCV的使用 – 图像灰度化

安装opencv

这个毕业设计,打算使用python来实现,编辑器使用pycharm。图像处理方面,主要使用opencv。首先安装opencv,很简单,一条命令即可:
pip install opencv-python

如果离线安装的话,不妨参考使用OpenCV实现实时视频目标检测

安装完成后,命令行中输入python,进入python shell。输入import cv2回车,如果没有报错,说明安装成功。

简单灰度化

在加载图片的时候,直接调用opencv的灰度化方法。

1
2
3
4
5
6
import cv2
image = cv2.imread('image/test.jpg')
grayimage = cv2.imread('image/test.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('image',image)
cv2.imshow('grayimage',grayimage)
cv2.waitKey(0)

分量法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2
image = cv2.imread('image/test.jpg')

b,g,r = cv2.split(image) # the order is not r,g,b

cv2.namedWindow("Image")
cv2.imshow("Image",image)

cv2.namedWindow("ImageR")
cv2.imshow("ImageR",r)

cv2.namedWindow("ImageG")
cv2.imshow("ImageG",g)

cv2.namedWindow("ImageB")
cv2.imshow("ImageB",b)
cv2.waitKey(0)

cv2.destroyAllWindows()

最大值法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import cv2
import numpy
image = cv2.imread('image/test.jpg')

shape = (image.shape[0],image.shape[1])
newImage = numpy.ndarray(shape,image.dtype)

for i in range(image.shape[0]):
for j in range(image.shape[1]):
newImage[i,j] = max(image[i,j][0],image[i,j][1],image[i,j][2])

cv2.namedWindow("NewImageMax")
cv2.imshow("NewImageMax",newImage)
cv2.waitKey(0)

cv2.destroyAllWindows()

平均值法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cv2
import numpy
image = cv2.imread('image/test.jpg')

shape = (image.shape[0],image.shape[1])
newImage = numpy.ndarray(shape,image.dtype)


for i in range(image.shape[0]):
for j in range(image.shape[1]):
newImage[i,j] = (int(image[i,j][0]) + int(image[i,j][1]) + int(image[i,j][2])) / 3

cv2.namedWindow("NewImageAver")
cv2.imshow("NewImageAver",newImage)
cv2.waitKey(0)

cv2.destroyAllWindows()

加权平均法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import cv2
import numpy
image = cv2.imread('image/test.jpg')

shape = (image.shape[0],image.shape[1])
newImage = numpy.ndarray(shape,image.dtype)

for i in range(image.shape[0]):
for j in range(image.shape[1]):
newImage[i,j] = 0.11 * image[i,j][0] + 0.59 * image[i,j][1] + 0.30 * image[i,j][2]

cv2.namedWindow("NewImageWeightAver")
cv2.imshow("NewImageWeightAver",newImage)
cv2.waitKey(0)

cv2.destroyAllWindows()

后记

关于图像灰度化,就整理到这里,之后会继续研究其他知识点。

书签

opencv-python快速入门篇