目录
灰度变换
灰度变换共有三种方法:
1.比例线性变换
2.分段线性变换
3.非线性变换
实战案例:
概念:受到外部环境光照的影响,我们获取到的图像往往不够理想,细节分辨不清,即所谓的对比度不足。
对比度是指图像亮度的最大值与最小值之比。(白色越凉、黑色越暗,对比度就越高)
目的:通过使用灰度变换方法来解决图像中存在的对比度不足的问题。
曝光过度;曝光不足的示意图如下:
指对像素逐个进行处理,将原始图像灰度值的动态范围按线性关系扩展到指定的范围或者整个动态范围。比例线性变换包括:正比变换和反比变换。
该变换用于突出感兴趣的目标或亮度值的区域,局部扩展亮度值的范围,可以有效的利用有限的灰度值,达到最大限度增强图像中对我们有用的信息的目的,从而增强图像的对比度。
该变换主要利用非线性函数来突出感兴趣的目标或亮度值的区域,局部扩展亮度范围,可以有效利用有限的灰度值,达到最大限度增强图像中有用信息的目的,从而增强图像的对比度。
下图是用来进行灰度变化的原图,可以看到该图像存在曝光不足的特点。 目的:通过灰度变换将该图像进行对比度调整。从而让我们更有效的获取图中的有效信息。
需要用到的代码部分函数如下:
np.zeros()函数返回一个元素全为0且给定形状和类型的数组:
zeros(shape, dtype=float, order=‘C’)
1.shape:形状
2.dtype:数据类型,可选参数,默认numpy.float64
3.order:可选参数,c代表与c语言类似,行优先;F代表列优先
经过log变换后0-255变成了0-5.5,需要在8比特的显示器中进行显示,则需要将其归一化规范化到(0,255)中,即使用normalize来实现
.cv2.normalize( src, # 输入数组。 dst[, # 与 src 大小相同的输出数组。 alpha[, # 归一范数目标值 / 最大最小规范化中的下限 beta[, # 范数归一化时该值无效 / 最大最小规范化中的上限 norm_type[, # 归一化方法 dtype[, # 当为负数时,输出数组的类型与 src 相同;否则,它具有与 src 相同的通道数和深度 mask]]]]] # 数据蒙版(可选) ) -> dst
通过伽马变换和分段线性变化的结果如图所示:
最后附上我的代码
import cv2
import math
import numpy as np
from matplotlib import pyplot as plt
#导入包
gray_img = cv2.imread("eximage.png",0) #0表示读入的为灰度图,1表示为RGB三通道图像
# 读入图片(单通道灰度图)
# cv2.imshow("123",gray_img)
# cv2.waitKey()
photoshape_img = np.zeros((gray_img.shape[0],gray_img.shape[1]),dtype=np.uint8)
#
r1,s1 = 40,100
r2,s2 = 200,250
k1 = s1/r2 #第一段函数斜率
k2 = (s2-s1)/(r2-r1) #第二段函数斜率
k3 = (255-s2)/(255-r2) #第三段函数斜率
# 构造跟原图等大小的零值图,用于保存分段线性变换结果;设置分段线性函数参数;
for i in range(gray_img.shape[0]):
for j in range(gray_img.shape[1]):
if r1 <= gray_img[i,j] <= r2:
photoshape_img[i,j] = k2*(gray_img[i,j] - r1) + s1
elif gray_img[i,j] < r1:
photoshape_img[i,j] = k1*gray_img[i,j]
elif gray_img[i,j] > r2:
photoshape_img[i,j] = k3 * (gray_img[i,j] - r2) + s2
# cv2.imshow('12',photoshape_img)
# cv2.waitKey()
# 遍历图像每个像素值,按照公式进行分段线性变换;
gamma_img = np.zeros((gray_img.shape[0],gray_img.shape[1],1),dtype=np.float32)
# 构造跟原图等大小的零值图,用于保存伽马变换结果;
for i in range(gray_img.shape[0]):
for j in range(gray_img.shape[1]):
gamma_img[i,j] = math.pow(gray_img[i,j],0.5)
cv2.normalize(gamma_img,gamma_img,0,255,cv2.NORM_MINMAX)
gamma_img = cv2.convertScaleAbs(gamma_img)
# cv2.imshow('12',gamma_img)
# cv2.waitKey()
# 遍历图像每个像素值,按照公式进行伽马变换;
plt.subplot(321);plt.imshow(gray_img,'gray');plt.title("srcImg")
plt.subplot(322);plt.hist(gray_img.ravel(),256,[0,256]),
plt.title("Histogram");plt.xlim([0,256])
plt.subplot(323),plt.imshow(photoshape_img,'gray'),plt.title("picewise")
plt.subplot(324),plt.hist(photoshape_img.ravel(),256,[0,256]),
plt.title("Histogram"),plt.xlim([0,256])
plt.subplot(325),plt.imshow(gamma_img,'gray'),plt.title("gamma")
plt.subplot(326),plt.hist(gamma_img.ravel(),256,[0,256]),
plt.title("Histogram"),plt.xlim([0,256])
plt.tight_layout()#会自动调整子图参数,使之填充整个图像区域
plt.show()
# 显示变换结果,进行效果比对。