# %matplotlib inline
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))
<Figure size 800x800 with 0 Axes>
<Figure size 800x800 with 0 Axes>
plt.subplot(131)
plt.title('origin image')
plt.imshow(image,plt.cm.gray)
plt.axis('off')
(np.float64(-0.5), np.float64(511.5), np.float64(511.5), np.float64(-0.5))
plt.subplot(132)
plt.title('gamma=2')
plt.imshow(gam1,plt.cm.gray)
plt.axis('off')
(np.float64(-0.5), np.float64(511.5), np.float64(511.5), np.float64(-0.5))
plt.subplot(133)
plt.title('gamma=0.5')
plt.imshow(gam2,plt.cm.gray)
plt.axis('off')
plt.show()
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))
<Figure size 800x800 with 0 Axes>
<Figure size 800x800 with 0 Axes>
plt.subplot(121)
plt.title('origin image')
plt.imshow(image,plt.cm.gray)
plt.axis('off')
(np.float64(-0.5), np.float64(511.5), np.float64(511.5), np.float64(-0.5))
plt.subplot(122)
plt.title('log')
plt.imshow(gam1,plt.cm.gray)
plt.axis('off')
plt.show()
from skimage import data, exposure
image =data.moon()
result=exposure.is_low_contrast(image)
print(result)
False
import numpy as np
from skimage import exposure
image = np.array([51, 102, 153], dtype=np.uint8)
mat=exposure.rescale_intensity(image)
print(mat)
[ 0 127 255]
即像素最小值由 51 变为 0 ,最大值由 153 变为 255 ,整体进行了拉伸,
但是数据类型没有变,还是 uint8。
前面我们讲过,可以通过 img_as_float() 函数将 unit8 类型转换为 float 型,
实际上还有更简单的方法,就是乘以 1.0 。
import numpy as np
image = np.array([51, 102, 153], dtype=np.uint8)
print(image*1.0)
[ 51. 102. 153.]
即由 [51,102,153] 变成了 [  51.  102.  153.]
而 float 类型的范围是 [0,1] ,因此对 float 进行 rescale_intensity 调整后,
范围变为 [0,1] ,而不是 [0,255]
import numpy as np
from skimage import exposure
image = np.array([51, 102, 153], dtype=np.uint8)
tmp=image*1.0
mat=exposure.rescale_intensity(tmp)
print(mat)
[0. 0.5 1. ]
如果原始像素值不想被拉伸,只是等比例缩小,就使用 in_range 参数,如:
import numpy as np
from skimage import exposure
image = np.array([51, 102, 153], dtype=np.uint8)
tmp=image*1.0
mat=exposure.rescale_intensity(tmp,in_range=(0,255))
print(mat)
[0.2 0.4 0.6]
输出为:[ 0.2  0.4  0.6] ,即原像素值除以 255 。
如果参数 in_range 的 [main,max] 范围要比原始像素值的范围 [min,max] 大或者小,
那就进行裁剪,如:
mat=exposure.rescale_intensity(tmp,in_range=(0,102))
print(mat)
[0.5 1. 1. ]
输出 [ 0.5  1.   1. ] ,即原像素值除以 102 ,超出 1 的变为 1 。
如果一个数组里面有负数,现在想调整到正数,就使用 out_range 参数。如:
import numpy as np
from skimage import exposure
image = np.array([-10, 0, 10], dtype=np.int8)
mat=exposure.rescale_intensity(image, out_range=(0, 127))
print(mat)
[ 0. 63.5 127. ]