操做环境:windows10系统,spyder3 编辑器,python3语言。html
定义:经过对图像进行各类便函,逐点改变源图像像素灰度值的相关方法。python
目的: 改善画质。算法
主要内容:图像的线性变换与非线性变换,主要为图像反转,对数变换等,图像的直方图均衡,图像的二值化处理。编程
令r为变换前的灰度,s为变换后的灰度,则线性变换的函数:s=a⋅r+bs=a⋅r+b;其中,a为直线的斜率,b为在y轴的截距。选择不一样的a,b值会有不一样的效果:windows
在进行图像加强时,上述的线性变换函数用的较多的就是图像反转了,根据上面的参数,图像反转的变换函数为:s=255−ss=255−s。图像反转获得的是图像的负片,可以有效的加强在图像暗区域的白色或者灰色细节。dom
如下是“图像反转”在python3下的实现。(全部代码直接用须要有能识别中文编码的定义即# -*- coding: utf-8 -*-)编辑器
1 import matplotlib.pyplot as plt 2 import numpy as np 3 from skimage.util import random_noise 4 from PIL import Image 5
6 img = plt.imread('F:/python编程/本身的博客园代码/图像变换/example_gray.jpg') 7 fig = plt.figure(figsize = (8.0,6.0)) 8 ax1 = fig.add_subplot(1,2,1) 9 ## show the original picture
10 ax1.imshow(img) 11 plt.title('original_picture') 12
13 ## 图像反转
14 img_reversal = 255- img 15 ax2 = fig.add_subplot(1,2,2) 16 ax2.imshow(img_reversal) 17 plt.title('reversal_picture')
对数变换的通用公式是:ide
其中,c是一个常数,底数为,实际计算的时候,须要用换底公式。+1的缘由是log的定义域须要>0才有意义。对数变换,将源图像中范围较窄的低灰度值映射到范围较宽的灰度区间,同时将范围较宽的高灰度值区间映射为较窄的灰度区间,从而扩展了暗像素的值,压缩了高灰度的值,可以对图像中低灰度细节进行加强。函数
如下是图像对数变换在python3下的实现。ui
1 #### 图像的灰度变换
2 import matplotlib.pyplot as plt 3 import numpy as np 4 from skimage.util import random_noise 5 from PIL import Image 6
7 img = plt.imread('F:/python编程/本身的博客园代码/图像变换/example_gray.jpg') 8 fig = plt.figure(figsize = (8.0,6.0)) 9 ax1 = fig.add_subplot(1,2,1) 10 ## show the original picture
11 ax1.imshow(img) 12 plt.title('original_picture') 13
14 ## 图像的log变换
15 img_log = np.log(1 + np.abs(img/255)) #### (0,1)的输入
16 ax3 = fig.add_subplot(1,2,2) 17 ## show the original picture
18 ax3.imshow(img_log) 19 plt.title('log_picture')
图像的直方图——横坐标为图像灰度值,纵坐标为在某灰度级下的像素个数。
直方图均衡技术将原始图像的灰度直方图从比较集中的某个灰度区间变成在所有灰度范围内的均匀分布, 因为其算法简单, 无需借助外来因素的参数设置,能够自成系统的运行, 有效地加强图像对比度, 是一种经常使用的图像加强方法。
如下是图像的直方图均衡在python3下的实现。
1 #### 直方图均衡
2 from skimage import data,exposure 3 import matplotlib.pyplot as plt 4
5 img = plt.imread('F:/python编程/本身的博客园代码/图像变换/example_gray.jpg') 6 plt.figure("hist",figsize=(8,8)) 7
8 arr=img.flatten() 9 plt.subplot(221) 10 plt.imshow(img,plt.cm.gray) #原始图像
11 plt.subplot(222) 12 plt.hist(arr, bins=256, normed=1,edgecolor='None',facecolor='red') #原始图像直方图
13
14 img1=exposure.equalize_hist(img) 15 arr1=img1.flatten() 16 plt.subplot(223) 17 plt.imshow(img1,plt.cm.gray) #均衡化图像
18 plt.subplot(224) 19 plt.hist(arr1, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方图
图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。该过程将256个亮度等级的灰度图像经过适当的阈值选取而得到仍然能够反映图像总体和局部特征的二值化图像。
如下是图像的二值化在python3下的实现。
1 #### 图像的灰度变换
2 import matplotlib.pyplot as plt 3 import numpy as np 4 from skimage.util import random_noise 5 from PIL import Image 6
7 img = plt.imread('F:/python编程/本身的博客园代码/图像变换/example_gray.jpg') 8 fig = plt.figure(figsize = (8.0,6.0)) 9 ax1 = fig.add_subplot(1,2,1) 10 ## show the original picture
11 ax1.imshow(img) 12 plt.title('original_picture') 13
14 ## 二值化
15 img.flags.writeable = True ### 必须加这句否则会报错,由于图像开始只是只读模式
16 threshold = 128
17 H,W,X = img.shape 18 for i in range(X-1): 19 for j in range(H-1): 20 for k in range(W-1): 21 if img[j,k,i] > threshold: 22 img[j,k,i] = 255
23 else: 24 img[j,k,i] = 0 25 img_twovalues = img 26 ax3 = fig.add_subplot(1,2,2) 27 ## show the original picture
28 ax3.imshow(img_twovalues) 29 plt.title('twovalues_picture')
本文参考博文:
https://blog.csdn.net/xuehuitanwan123/article/details/82018051