数字图像处理—学习日记(2):图像直方图及均衡化

基本的图像处理操作

交互式标注

使用PyLab库ginput()函数进行交互式标注。
下面展示代码,脚本首先绘制图像,然后等待用户在图像窗口图像区域点击三次,点击得到的坐标【x, y】自动保存在x列表中。

from PIL import Image
from pylab imprt *

im = array(Image.open('example.jpg'))
imshow(im)

print('Please click 3 points')
x = ginput(3)
print('you click:',x)
show()

图像数组表示

当载入图像时,我们通过调用 array() 方法图像转换成 NumPy 的数组对象,NumPy 中的数组对象是多维的,但是数组中所有的元素必须具有相同的数据类型。除非创建数组对象时指定数据类型,否则,数据类型自动确定。

im = array(Image.open('example.jpg'))
print(im.shape, im.dtype)

im = array(Image.open('example.jpg').convert('L'), 'f')
print(im.shape, im.dtype)

控制台输出如下:
(800, 569, 3) uint8
(800, 569) float32
图像数组中的元素(像素值)可以通过坐标i,j,和颜色通道k的进行访问:

im = value[i, j, k]

图像数组的像素值通过切片方式进行读取,其中负数切片表示从最后一个元素逆向计数:

im[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行
im[:,i] = 100 # 将第 i 列的所有数值设为 100
im[:100,:50].sum() # 计算前 100 行、前 50 列所有数值的和
im[50:100,50:100] # 50~100 行, 50~100 列(不包括第 100 行和第 100 列)
im[i].mean() # 第 i 行所有数值的平均值
im[:,-1] # 最后一列
im[-2,:] (or im[-2]) # 倒数第二行

图像数组的灰度表示

例:对图像数组进行灰度变换,其中对图像进行二次函数变换,可以使较暗的像素值变得更小。

from PIL import Image
from numpy import *

im = array(Image.open('empire.jpg').convert('L'))
im2 = 255 - im # 对图像进行反相处理
im3 = (100.0/255) * im + 100 # 将图像像素值变换到 100...200 区间
im4 = 255.0 * (im/255.0)**2 # 对图像像素值求平方后得到的图像

可以通过以下命令查看最小和最大像素:

print(int(im.min()), int(im.max()))

在这里插入图片描述
array()变换的反操作可以通过foraarray()函数完成:

pil_im = Image.forarray(im)

#将unit8数据类型转为其他数据类型,在创建PIL图像时,可以通过这种方式转换回来:
pil_im = Image.formarray(uint8(im))

注意:(1) NumPy总是将数组数据类型转换成能够表示数据的“最低”数据类型。对浮点数做乘积或除法操作会使整数类型的数组变成浮点类型。(2)如果不确定输入数据类型,安全起见,可以先转回来。

图像缩放

例:简单的图像缩放函数。

def imresize(im, sz):
	"""使用PIL对象重新,定义图像数组的大小"""
	pil_im = Image.fromarray(uint8(im))
	return array(pil_im.resize(sz))

直方图均衡化

直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好的方法,并且可以增强图像的对比度。
直方图均衡化的变换函数是图像中像素值的累积分布函数(cumulative distribution function, 简写为 cdf,将像素值的范围映射到目标范围的归一化作)。
例:直方图均衡化,参数是灰度图像,直方图使用的小区间的数目。函数返回直方图均衡化后的图像,以及用来做像素值映射的累积分布函数。注意,函数中使用到累积分布函数的最后一个元素(下标为-1),目的是将其归一化到 0…1范围。你可以像下面这样使用该函数:

def histeq(im, nbr, bins=256):
	"""对一幅图进行直方图均衡化"""
	imhist, bins = histogram(im.flatten(), nbr_bins, normed=True)
	#cumulative distribution function
	cdf = imhist.cumsum()
	#归一化
	cdf = 255 * cdf / cdf[-1]
	#使用到累计分布函数的线性插值,计算新的像素值
	im_2 = intrep(im.flatten(), bins[:-1], cdf)
	return im_2.reshape(im.shape), cdf
可以通过这种方式使用该函数。
from PIL import Image
from numpy import *

im = array(Image.open('AquaTermi_lowcontrast.jpg').convert('L'))
im_2,cdf = imtools.histeq(im)

在这里插入图片描述

图像平均

图像平均是为了减少噪声的一种操作。假设所有的图像具有相同的大小,我们可以将这些图像简单地相加,然后除以图像的数目,来计算平均图像。下面的函数可以用于计算平均图像,将其添加到 imtool.py 文件里:

def compute_average(imlist):
	"""计算图像列表的平均图像"""
	#打开第一幅图像,存储于浮点型数组
	averageim = array(Image.open(imlist[0], 'f'))

	for imname in imlist[1:]:
		try:
			averageim += array(Image.opeen(imname))
		except:
			print(imname + '...skipped')
	#也可以用mean()函数计算平均图像,但需要将所有图像堆积到一个数组中,占内存。
	averageim /= len(imlist)

	#返回uint8的平均图像
	return array(averageim, 'uint8')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarkJhon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值