图像处理——图像变换

操作环境:windows10系统,spyder3 编辑器,python3语言。

定义:通过对图像进行各种便函,逐点改变源图像像素灰度值的相关方法。

目的: 改善画质。

主要内容:图像的线性变换与非线性变换,主要为图像反转,对数变换等,图像的直方图均衡,图像的二值化处理。

一、图像反转

  令r为变换前的灰度,s为变换后的灰度,则线性变换的函数:s=ar+bs=a⋅r+b;其中,a为直线的斜率,b为在y轴的截距。选择不同的a,b值会有不同的效果:

  • a>1a>1,增加图像的对比度
  • a<1a<1,减小图像的对比度
  • a=1b0a=1且b≠0,图像整体的灰度值上移或者下移,也就是图像整体变亮或者变暗,不会改变图像的对比度。
  • a<0b=0a<0且b=0,图像的亮区域变暗,暗区域变亮
  • a=1b=0a=1且b=0,恒定变换,不变
  • a=1b=255a=−1且b=255,图像反转。

  在进行图像增强时,上述的线性变换函数用的较多的就是图像反转了,根据上面的参数,图像反转的变换函数为:s=255ss=255−s。图像反转得到的是图像的负片,能够有效的增强在图像暗区域的白色或者灰色细节。

以下是“图像反转”在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')
View Code

 图像的反转

二、图像的对数变换

对数变换的通用公式是:

 

  其中,c是一个常数,底数为,实际计算的时候,需要用换底公式。+1的原因是log的定义域需要>0才有意义。对数变换,将源图像中范围较窄的低灰度值映射到范围较宽的灰度区间,同时将范围较宽的高灰度值区间映射为较窄的灰度区间,从而扩展了暗像素的值,压缩了高灰度的值,能够对图像中低灰度细节进行增强。

以下是图像对数变换在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 ## 图像的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')
View Code

图像的log变换

三、图像的直方图均衡

  图像的直方图——横坐标为图像灰度值,纵坐标为在某灰度级下的像素个数。

  直方图均衡技术将原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布, 由于其算法简单, 无需借助外来因素的参数设置,可以自成系统的运行, 有效地增强图像对比度, 是一种常用的图像增强方法。

以下是图像的直方图均衡在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') #均衡化直方图
View Code

图像的直方图均衡

四、图像的二值化处理

  图像二值化( 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')
View Code

本文参考博文:

https://blog.csdn.net/xuehuitanwan123/article/details/82018051

https://www.cnblogs.com/wangguchangqing/p/6983680.html

https://www.jb51.net/article/139446.htm

      

原文地址:https://www.cnblogs.com/E-Dreamer-Blogs/p/10484609.html