本文共享自华为云社区《[Python图画处理] 十六.图画的灰度非线性改换之对数改换、伽马改换》,作者:eastmount 。

一.图画灰度非线性改换

图画的灰度非线性改换首要包括对数改换、幂次改换、指数改换、分段函数改换,通过非线性联系对图画进行灰度处理,下面首要解说三种常见类型的灰度非线性改换。

原始图画的灰度值按照DB=DADA/255的公式进行非线性改换,其代码如下:

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取原始图画
img = cv2.imread('miao.png')
#图画灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图画高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创立一幅图画
result = np.zeros((height, width), np.uint8)
#图画灰度非线性改换:DB=DADA/255
for i in range(height):
    for j in range(width):
        gray = int(grayImage[i,j])*int(grayImage[i,j]) / 255
        result[i,j] = np.uint8(gray)
#显现图画
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显现
cv2.waitKey(0)
cv2.destroyAllWindows()

图画灰度非线性改换的输出结果下图所示:

跟我学Python图像处理丨何为图像的灰度非线性变换

二.图画灰度对数改换

图画灰度的对数改换一般表明如公式所示:

跟我学Python图像处理丨何为图像的灰度非线性变换

其间c为标准比较常数,DA为原始图画灰度值,DB为改换后的方针灰度值。如下图所示,它表明对数曲线下的灰度值变化状况。

跟我学Python图像处理丨何为图像的灰度非线性变换

由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图画通过对数改换后,较暗区域的对比度将有所提高。这种改换可用于增强图画的暗部细节,然后用来扩展被紧缩的高值图画中的较暗像素。

对数改换完成了扩展低灰度值而紧缩高灰度值的作用,被广泛地应用于频谱图画的显现中。一个典型的应用是傅立叶频谱,其动态规模可能宽达0~106直接显现频谱时,图画显现设备的动态规模往往不能满足要求,然后丢掉很多的暗部细节;而在运用对数改换之后,图画的动态规模被合理地非线性紧缩,然后能够明晰地显现。鄙人图中,未经改换的频谱通过对数改换后,增加了低灰度区域的对比度,然后增强暗部的细节。

跟我学Python图像处理丨何为图像的灰度非线性变换

下面的代码完成了图画灰度的对数改换。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import cv2
#制作曲线
def log_plot(c):
    x = np.arange(0, 256, 0.01)
    y = c * np.log(1 + x)
    plt.plot(x, y, 'r', linewidth=1)
    plt.rcParams['font.sans-serif']=['SimHei'] #正常显现中文标签
    plt.title(u'对数改换函数')
    plt.xlim(0, 255), plt.ylim(0, 255)
    plt.show()
#对数改换
def log(c, img):
    output = c * np.log(1.0 + img)
    output = np.uint8(output + 0.5)
    return output
#读取原始图画
img = cv2.imread('test.png')
#制作对数改换曲线
log_plot(42)
#图画灰度对数改换
output = log(42, img)
#显现图画
cv2.imshow('Input', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

下图表明通过对数函数处理后的作用图,对数改换关于全体对比度偏低而且灰度值偏低的图画增强作用较好。

跟我学Python图像处理丨何为图像的灰度非线性变换

对应的对数函数曲线如图

跟我学Python图像处理丨何为图像的灰度非线性变换

三.图画灰度伽玛改换

伽玛改换又称为指数改换或幂次改换,是另一种常用的灰度非线性改换。图画灰度的伽玛改换一般表明如公式所示:

跟我学Python图像处理丨何为图像的灰度非线性变换

  • 当>1时,会拉伸图画中灰度级较高的区域,紧缩灰度级较低的部分。
  • 当<1时,会拉伸图画中灰度级较低的区域,紧缩灰度级较高的部分。
  • 当=1时,该灰度改换是线性的,此刻通过线性方法改变原图画。

Python完成图画灰度的伽玛改换代码如下,首要调用幂函数完成。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import cv2
#制作曲线
def gamma_plot(c, v):
    x = np.arange(0, 256, 0.01)
    y = c*x**v
    plt.plot(x, y, 'r', linewidth=1)
    plt.rcParams['font.sans-serif']=['SimHei'] #正常显现中文标签
    plt.title(u'伽马改换函数')
    plt.xlim([0, 255]), plt.ylim([0, 255])
    plt.show()
#伽玛改换
def gamma(img, c, v):
    lut = np.zeros(256, dtype=np.float32)
    for i in range(256):
        lut[i] = c * i ** v
    output_img = cv2.LUT(img, lut) #像素灰度值的映射
    output_img = np.uint8(output_img+0.5)  
    return output_img
#读取原始图画
img = cv2.imread('test.png')
#制作伽玛改换曲线
gamma_plot(0.00000005, 4.0)
#图画灰度伽玛改换
output = gamma(img, 0.00000005, 4.0)
#显现图画
cv2.imshow('Imput', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

下图表明通过伽玛改换处理后的作用图,伽马改换关于图画对比度偏低,而且全体亮度值偏高(或由于相机过曝)状况下的图画增强作用显着。

跟我学Python图像处理丨何为图像的灰度非线性变换

对应的幂律函数曲线如图所示。

跟我学Python图像处理丨何为图像的灰度非线性变换

参考文献:

  • 杨秀璋等. 基于苗族服饰的图画锐化和边际提取技术研究[J]. 现代计算机,2018(10).
  • 《数字图画处理》(第3版),冈萨雷斯著,阮秋琦译,电子工业出版社,2013年.
  • 《数字图画处理学》(第3版),阮秋琦,电子工业出版社,2008年,北京.
  • 《OpenCV3编程入门》,毛星云,冷雪飞,电子工业出版社,2015.
  • [数字图画处理] 五.MFC图画点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
  • python+opencv+图画特效(图画灰度处理、颜色翻转、图片融合,边际检测,浮雕作用)
  • 数字图画处理-空间域处理-灰度改换-根本灰度改换函数
  • OpenCV图画增强算法完成(直方图均衡化、拉普拉斯、Log、Gamma)

点击重视,第一时间了解华为云新鲜技术~