图像增强之灰度线性变换(python实现)


空域增强是指在由像素组成的空间直接对像素进行增强的方法,可表示为
g ( x , y ) = T [ f ( x , y ) ] g(x,y)=T[f(x,y)] g(x,y)=T[f(x,y)]
式中:f(x,y)是增强前的图像;g(x,y)是增强后的图像;T是对f的增强操作,可以用作于(x,y)处的单个像素,也可以是该像素的临域,还可以是一系列图像在该处的像素集合。常用的灰度变换方法有灰度线性变换、分段线性变换、非线性变换。

1.1灰度线性变换

假定原图像f(x,y)的灰度范围为[a,b],希望变换后图像g(x,y)的灰度范围扩展至[c,d],则灰度线性变换可表示为
g ( x , y ) = d − c b − a [ f ( x , y ) − a + c ] g(x,y)=\frac{d-c}{b-a}[f(x,y)-a+c] g(x,y)=badc[f(x,y)a+c]

1.2具体实现

分别给出将灰度范围(10.100)拉伸到(0,150)和(10,200)、压缩到(50,100)和(10,125)、平移到(110,225)的线性变换。

'''灰度线性变换
g(x,y)=(d-c)/(b-a)(f(x,y)-a)+c
'''
import  cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

#灰度线性变换
def linear_trans(img,x):
    a,b,c,d,=x
    w,h=img.shape[:2]
    new_img=np.zeros((w,h),dtype=np.uint8)
    k=(d-c)/(b-a)
    for i in range(w):
        for j in range(h):
            new_img[i,j]=k*(img[i,j]-a)+c
            
            if new_img[i,j]>255:
                new_img[i,j]=255
            if new_img[i,j]<0:
                new_img[i,j]=0
    return new_img
if __name__=="__main__":
    path="D:\\code\\python\\opencv\\lena.jpg"
    img=cv.imread(path,0)
    x1=np.array([10,100,0,150])
    x2=np.array([10,100,10,200])
    x3=np.array([10,100,50,100])
    x4=np.array([10,100,110,125])

    new_img1=linear_trans(img,x1)
    new_img2=linear_trans(img,x2)
    new_img3=linear_trans(img,x3)
    new_img4=linear_trans(img,x4)
    titles=["(10,100)","(0,150)","(10,200)","(50,100)","(110,125)"]
    new_img=[img,new_img1,new_img2,new_img3,new_img4]
    plt.figure(figsize=(8,6))
    for i in range(5):
        plt.subplot(2,3,i+1)
        plt.rcParams['font.sans-serif']=['SimHei']
        plt.imshow(new_img[i],cmap='gray')
        plt.title(titles[i])

1.3实现结果

灰度线性变换

猜你喜欢

转载自blog.csdn.net/m0_53192838/article/details/127409172