1. 前言
离研究生毕业只有六个月了,毕业设计也该动手了。去年开题,选择了《基于图像处理的客观题自动阅卷系统的设计与实现》这个题目。今年中期,考虑了很久,最终还是没有换题目。想要做AIOps,但是自己基础薄弱,也没有特定的方向,到了六月份也不一定能完成。保险起见,还是做阅卷系统吧!
阅卷系统主要有五个方面的研究内容,分别是图像预处理、目标检测、图像分割、手写识别和移动Web。其中图像预处理包括试卷图像的灰度化、二值化、去噪、倾斜矫正等;目标检测是为了定位学号和答案的位置,并且提取出这些信息;图像分割是为了分割学号和多选题的字符;手写识别是为了识别手写字符,包括数字和字母;移动Web是为了方便老师随时随地使用系统。
本文,就来研究一下图像的灰度化。
2. 理论
在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))
更多内容参考图像分析。
3. 实践
算法的实现,主要参考Python下OpenCV的使用 – 图像灰度化。
3.1. 安装opencv
这个毕业设计,打算使用python来实现,编辑器使用pycharm。图像处理方面,主要使用opencv。首先安装opencv,很简单,一条命令即可:
pip install opencv-python
如果离线安装的话,不妨参考使用OpenCV实现实时视频目标检测。
安装完成后,命令行中输入python
,进入python shell。输入import cv2
回车,如果没有报错,说明安装成功。
3.2. 简单灰度化
在加载图片的时候,直接调用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)
|
3.3. 分量法
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()
|
3.4. 最大值法
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()
|
3.5. 平均值法
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()
|
3.6. 加权平均法
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()
|
4. 后记
关于图像灰度化,就整理到这里,之后会继续研究其他知识点。
5. 书签
opencv-python快速入门篇