# %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. ]