数字图像处理:python实现图像的对比度和亮度调整(九)

skimage包的全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能。它是由python语言编写的,由scipy 社区开发和维护。skimage包由许多的子模块组成,各个子模块提供不同的功能。主要子模块列表如下:

子模块名称                 主要实现功能
io                            读取、保存和显示图片或视频
data                       提供一些测试图片和样本数据
color                           颜色空间变换
filters             图像增强、边缘检测、排序滤波器、自动阈值等
draw               操作于numpy数组上的基本图形绘制,包括线条、矩形、圆和文本等
transform          几何变换或其它变换,如旋转、拉伸和拉东变换等
morphology          形态学操作,如开闭运算、骨架提取等
exposure              图片强度调整,如亮度调整、直方图均衡等
feature                        特征检测与提取等
measure                  图像属性的测量,如相似性或等高线等
segmentation                          图像分割
restoration                           图像恢复
util                                  通用函数

由上面可知,图像亮度与对比度的调整,是放在skimage包的exposure模块里面

实验一: gamma调整
原理:I = Ig
对原图像的像素,进行幂运算,得到新的像素值。
g:gamma的值
g>1: 新图像比原图像暗
g<1: 新图像比原图像亮
函数调用格式:

skimage.exposure.adjust_gamma(image, gamma=1) # gamma参数默认为1,原像不发生变化 

python3代码实现(Spyder编辑器):

from skimage import data, exposure, img_as_float
import matplotlib.pyplot as plt
image = img_as_float(data.moon())
gam1= exposure.adjust_gamma(image, 2) #调暗
gam2= exposure.adjust_gamma(image, 0.5) #调亮plt.figure('adjust_gamma',figsize=(8,8))
plt.subplot(131)
plt.title('origin image')
plt.imshow(image,plt.cm.gray)
plt.axis('off')
plt.subplot(132)
plt.title('gamma=2')
plt.imshow(gam1,plt.cm.gray)
plt.axis('off')
plt.subplot(133)
plt.title('gamma=0.5')
plt.imshow(gam2,plt.cm.gray)
plt.axis('off')
plt.show()

run result:
数字图像处理:python实现图像的对比度和亮度调整(九)_第1张图片
从实验结果可以看出,gamma=2(>1)图像明显变暗,gamma=0.5(<1)图像明显变亮。

实验二:log对数调整
原理:I = log(I)
在gamma调整中,对原图像的每个像素进行幂计算;相反,在log对数调整中,对原图像每个像素点进行取对数操作。
函数调用格式:

 skimage.exposure.adjust_log(image) 

python3代码实现(Spyder编辑器):

from skimage import data, exposure, img_as_float
import matplotlib.pyplot as plt
image = img_as_float(data.moon())
gam1= exposure.adjust_log(image) #对数调整
plt.figure('adjust_gamma',figsize=(8,8))
plt.subplot(121)
plt.title('origin image')
plt.imshow(image,plt.cm.gray)
plt.axis('off')
plt.subplot(122)
plt.title('log adjust')
plt.imshow(gam1,plt.cm.gray)
plt.axis('off')
plt.show()

实验结果:
数字图像处理:python实现图像的对比度和亮度调整(九)_第2张图片
这个log调整,得依靠原图像本来亮暗程度了,因为没有参数限制。

实验三:判断图像对比度是否偏低
调用函数:is_low_contrast(img)
返回一个bool类型的值

from skimage import data, exposure, io
img =data.moon()
io.imshow(img)
result=exposure.is_low_contrast(img)
print(result)

运行结果:
数字图像处理:python实现图像的对比度和亮度调整(九)_第3张图片
返回False

实验四:调整强度

  1. 什么是图像强度?
    答:图像强度表示单通道图像像素的强度(值的大小)。
    在灰度图像中:它是图像的灰度。
    在RGB颜色空间中,可以理解为R通道的像素灰度值,G通道的像素灰度值,B通道的像素灰度值,也就是RGB中含三个图像强度。
    其他颜色空间类似,也就是每个通道的图像的像素灰度值。

  2. 调用函数:

skimage.exposure.rescale_intensity(image, in_range='image', out_range='dtype')
in_range 表示输入图片的强度范围,默认为'image', 表示用图像的最大/最小像素值作为范围
out_range 表示输出图片的强度范围,默认为'dype', 表示用图像的类型的最大/最小值作为范围
默认情况下,输入图片的[min,max]范围被拉伸到[dtype.min, dtype.max],如果dtype=uint8, 那么dtype.min=0, dtype.max=255
import numpy as np
from skimage import exposure
image = np.array([50, 102, 193], dtype=np.uint8)
mat=exposure.rescale_intensity(image)
print(mat)

run result:
在这里插入图片描述
即像素最小值由50变为0,最大值由193变为255,整体进行了拉伸,但是数据类型没有变,还是uint8。

注:前面我们讲过,可以通过img_as_float()函数将unit8类型转换为float型,实际上还有更简单的方法,就是乘以1.0

import numpy as np
image = np.array([50, 102, 193], dtype=np.uint8)
print(image*1.0)

run result:
在这里插入图片描述
即由[50,102,193]变成了[ 50. 102. 193.]
而float类型的范围是[0,1],因此对float进行rescale_intensity 调整后,范围变为[0,1],而不是[0,255]

import numpy as np
from skimage import exposure
image = np.array([50, 102, 193], dtype=np.uint8)
tmp=image*1.0
mat=exposure.rescale_intensity(tmp)
print(mat)

run result:
在这里插入图片描述
原始像素值不想被拉伸,只是等比例缩小,就使用in_range参数,如:

import numpy as np
from skimage import exposure
image = np.array([50, 102, 193], dtype=np.uint8)
tmp=image*1.0
mat=exposure.rescale_intensity(tmp,in_range=(0,255))
print(mat)

run result:
在这里插入图片描述
即原像素值除以255。

如果参数in_range的[main,max]范围要比原始像素值的范围[min,max] 大或者小,那就进行裁剪,如:

import numpy as np
from skimage import exposure
image = np.array([50, 102, 193], dtype=np.uint8)
tmp=image*1.0
mat=exposure.rescale_intensity(tmp,in_range=(0,102))
print(mat)

run result:
即原像素值除以102,超出1的变为1在这里插入图片描述
如果一个数组里面有负数,现在想调整到正数,就使用out_range参数。如:

import numpy as np
from skimage import exposure
image = np.array([-15, 0, 10], dtype=np.int8)
mat=exposure.rescale_intensity(image, out_range=(0, 127))
print(mat)

run result:
在这里插入图片描述
参考和引用:
https://www.cnblogs.com/denny402/p/5124402.html

https://www.jianshu.com/p/f2e88197e81d

https://blog.csdn.net/u014754127/article/details/53468464/

https://blog.csdn.net/vicdd/article/details/52647906

https://blog.csdn.net/qq_36941368/article/details/82998296#_5

仅用来个人学习和分享,如若侵权,留言立删。

尊重他人知识产权,不做拿来主义者!

喜欢的可以关注我哦QAQ,

你的关注和喜欢就是我write博文的动力。

你可能感兴趣的:(python,图像处理)