图像处理与机器视觉(1)
本人最近研究方向为图像处理与机器视觉,这个包括:图像的处理、图像的特征提取、图像语义分析与理解以及图像的分类与识别。
由于本科并不是读图像的,因此,只能快速地理解并掌握图像相关的概念,并进行适当的编程实现,加深印象!
1 图像的点运算
点运算是指:对图像中的每个像素依次进行同样的灰度变换运算。
1.1 灰度直方图
灰度直方图描述了一幅图像的灰度级统计信息,主要应用在于图像分割和图像灰度变换处理过程中。
从图形上来说,灰度直方图是一个二维图,横坐标是图像中各个像素点的灰度级别,纵坐标是各个灰度级别的像素在图像中出现的次数或频率。
1.2 灰度的线性变换
线性灰度变换函数f(x)是一个一维线性函数:
其中,参数fa为线性函数的斜率,fb是心啊行函数在y轴的截距,Da是输入图像的灰度,Db表示图像的灰度。其中:
当fa>1时,输出图像的对比度将增大;当fa<1时,输出图像的对比度将减小。
1.3 灰度对数变换
这是一种非线性变换。对数变换的一般表达式:
其中,c为尺度比例常数,s为源灰度值,t为变换后的目标灰度值。
这种变换可以增强一幅图像中较暗部分的细节,从而可以用来拓展被压缩的高值图像中的较暗像素,因此对数变换被广泛地应用于频谱图像的显示中,一个典型的应用就是傅里叶频谱。
1.4 gama变换
gama变换,一般表达式:
其中,x与y的取值范围均为[0,1],也就是说使用gama变换时,图像像素需要归一化。esp是补偿系数,r则是gama系数。
与对数变换不同,gama变换可以根据r的不同取值选择性地增强低灰度区域的对比或是高灰度区域的对比度。
其中:
r>1时,图像的高亮度区域对比度得到增强;
r=1时,灰度变换是线性的,即不改变原图像;
r<1时,图像的低灰度区域对比度得到增强。
gama变换在行人检测中经常会被用到。
1.5 灰度阈值变换
灰度阈值变换可以将一幅图像转换成黑白的二值图像。其表达式为:
某些图像分割的方法会用到。
1.6 直方图均衡化
直方图均衡化是一种实用性极高的直方图修正技术,是指通过某种灰度映射使输入图像转换为在每一灰度级上都有近似相同的像素点数的输出图像(即输出的直方图是均匀的)。
在经过均衡化处理后的图像中,像素将占有尽可能多的灰度级并且分布均匀。因此,这样的图像将具有较高的对比度和较大的动态范围。
以上图像处理技术的python实现
# -*- coding:utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1.1 获取灰度直方图
def gethist(img):
arr = np.zeros((1, 256))
for i in range(img.shape[0]):
for j in range(img.shape[1]):
arr[0][img[i][j]] += 1
return arr
# 1.2 灰度的线性变换
def linearchange(img, fa, fb):
afterimg = img*fa+fb
return afterimg
# 1.3 对数变换
def logchange(img, c=1):
logimg = np.zeros(img.shape)
normimg = img / float(np.max(img)) # 先归一化,再处理,能显示
for i in range(img.shape[0]):
for j in range(img.shape[1]):
logimg[i][j] = c * np.log(1 + normimg[i][j])
return logimg
# 1.4 gama变换
def gamachange(img, exp, r):
gamaimg = np.zeros(img.shape)
normimg = img/float(np.max(img))
for i in range(normimg.shape[0]):
for j in range(normimg.shape[1]):
gamaimg[i][j] = (normimg[i][j]+exp)**(r)
return gamaimg
# 1.5 灰度阈值变换
def im2bw(img, T):
bwimg = np.zeros(img.shape)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if(img[i][j] < T):
bwimg[i][j] = 0
else:
bwimg[i][j] = 255
return bwimg
if __name__ == '__main__':
img = cv2.imread("1.bmp", 0)
# 1.1 灰度直方图
allpixels = img.shape[0]*img.shape[1]
arr = gethist(img)
# 归一化直方图
normarr = arr / float(allpixels)
fig = plt.figure("hist")
fig.add_subplot(121)
plt.scatter(np.arange(0, 256).reshape(1, 256), arr)
fig.add_subplot(122)
plt.scatter(np.arange(0, 256).reshape(1, 256), normarr)
plt.show()
# 1.2 线性变换
linearimg = linearchange(img, 2, 55) # 此时,fa>1,对比度增大
#fanimg = linearchange(img,-1,255) # 此时为反向显示
cv2.imshow("Linear transformation", linearimg)
#cv2.imshow("反向显示",fanimg)
cv2.waitKey(0)
# 1.3 对数变换
logimg = logchange(img, 1)
cv2.imshow("Log transformation", logimg)
cv2.waitKey(0)
# 1.4 gama变换
normgama = np.zeros(img.shape)
gamaimg = gamachange(img,0,2)
cv2.imshow("gama transformation", gamaimg)
cv2.waitKey(0)
# 1.5 灰度阈值变换
bwimg = im2bw(img,100)
cv2.imshow("gray threshold transformation", bwimg)
cv2.waitKey(0)
# 1.6 直方图均衡化
histimg = cv2.equalizeHist(img)
cv2.imshow("hist equalization transformation", histimg)
cv2.waitKey(0)
运行结果: