图像灰度化

前言

离研究生毕业只有六个月了,毕业设计也该动手了。去年开题,选择了《基于图像处理的客观题自动阅卷系统的设计与实现》这个题目。今年中期,考虑了很久,最终还是没有换题目。想要做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快速入门篇

0%