图像的点运算及代数运算

一、点运算(灰度变换)

点运算是指对图像中每个像素的灰度值独立进行变换,输出像素值仅依赖于输入像素值,与周围像素无关。

1. 线性变换

原理

公式:g(x,y) = α·f(x,y) + β

  • α控制对比度(α>1增强,α<1减弱)

  • β控制亮度(β>0变亮,β<0变暗)

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    import os
    
    # 1. 正确读取图像
    file_path = r'C:\MyDip\1.jpg'  # 确保路径正确
    img = cv2.imread(file_path, 0)  # 0表示灰度模式
    
    if img is None:
        print("错误:无法加载图像,请检查:")
        print(f"1. 文件路径是否正确: {file_path}")
        print(f"2. 文件是否存在: {os.path.exists(file_path)}")
        print(f"3. 文件是否损坏")
        print("当前工作目录:", os.getcwd())
    else:
        # 2. 图像处理
        alpha = 1.5  # 对比度系数
        beta = 50  # 亮度增量
    
        # 线性变换
        linear_trans = np.clip(alpha * img + beta, 0, 255).astype(np.uint8)
    
        # 3. 显示结果
        plt.figure(figsize=(10, 5))
        plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original')
        plt.subplot(122), plt.imshow(linear_trans, cmap='gray'), plt.title('Linear Transform')
        plt.show()

    2. 非线性变换

    2.1 对数变换
    # 对数变换
    c = 42
    log_trans = np.clip(c * np.log1p(img), 0, 255).astype(np.uint8)

    2.2 伽马变换

    # 伽马变换
    gamma = 0.5
    gamma_trans = np.clip(255 * (img/255)**gamma, 0, 255).astype(np.uint8)

  • 二、代数运算

  • 代数运算是指两幅或多幅图像之间进行像素级的加减乘除运算。

    1. 图像加法

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    from torchvision.transforms.v2 import GaussianNoise
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 关键设置
    plt.rcParams['axes.unicode_minus'] = False
     
    img=cv2.imread('C:\MyDip\1.jpg',0)
    img=np.array(img)
    img.flags.writeable=True
    img=img/255.0
    noise_transform=GaussianNoise(0.1,0.05)#初始化噪声变换器,均值和标准差
    img_n=noise_transform(img)#返回处理后的图像,用实例解决
    plt.subplot(131)
    plt.imshow(img,'gray')
    plt.title('原图')
    plt.subplot(132)
    plt.imshow(img_n,'gray')
    plt.title('带噪声图片')
    k=np.zeros([img.shape[0],img.shape[1]])
    for i in range(100):
        noise_transform1=GaussianNoise(0,0.05)#初始化噪声变换器,均值和标准差
        j=noise_transform1(img)#返回处理后的图像,用实例解决
        k=k+j
    k=k/100
    plt.subplot(133)
    plt.imshow(k,'gray')
    plt.title('去噪后图片')
    plt.show()

    2. 图像减法

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    from torchvision.transforms.v2 import GaussianNoise
     
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 关键设置
    plt.rcParams['axes.unicode_minus'] = False
     
    img=cv2.imread('C:\MyDip\1.jpg',0)
    img=img/255.0
    noise_transform=GaussianNoise(0.1,0.05)#初始化噪声变换器,均值和标准差
    img_n=noise_transform(img)#返回处理后的图像,用实例解决
    K=img_n-img
    plt.subplot(131)
    plt.imshow(img_n,'gray')
    plt.title('有噪图像')
    plt.subplot(132)
    plt.imshow(img,'gray')
    plt.title('原始图像')
    plt.subplot(133)
    plt.imshow(K,'gray')
    plt.title('提取的噪声')
    plt.show()

    3.图像乘法

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
     
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 关键设置
    plt.rcParams['axes.unicode_minus'] = False
     
    img=cv2.imread('C:\MyDip\1.jpg',0)
    img1=cv2.multiply(1.2,img)#亮度增强
    img2=cv2.multiply(2,img)
    plt.subplot(131)
    plt.imshow(img,'gray')
    plt.title('原始图片')
    plt.subplot(132)
    plt.imshow(img1,'gray')
    plt.title('乘以 1.2')
    plt.subplot(133)
    plt.imshow(img2,'gray')
    plt.title('乘以 2')
    plt.show()

    4.图像除法

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
     
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 关键设置
    plt.rcParams['axes.unicode_minus'] = False
     
    img=cv2.imread('C:\MyDip\1.jpg',0)
    img1=cv2.divide(img,2)#像素值除以2,自动处理数据类型和溢出
    img2=cv2.divide(img,4)
    img3=cv2.divide(img,8)
    plt.subplot(141)
    plt.imshow(img,'gray',vmin=0,vmax=255)#vmin:将数组中的最小值 0 映射为纯黑色,vmax:将数组中的最大值 255 映射为纯白色
    plt.title('原始图像')
    plt.subplot(142)
    plt.imshow(img1,'gray',vmin=0,vmax=255)
    plt.title('除以 2')
    plt.subplot(143)
    plt.imshow(img2,'gray',vmin=0,vmax=255)
    plt.title('除以 4')
    plt.subplot(144)
    plt.imshow(img3,'gray',vmin=0,vmax=255)
    plt.title('除以 8')
    plt.show()

    四、总结

  • 点运算:改变单个像素的灰度值,用于对比度调整、亮度校正等

  • 代数运算:多幅图像之间的像素级运算,用于图像融合、运动检测等

    • 组合应用:点运算和代数运算常组合使用完成复杂图像处理任务

      注意:实际运行代码时需要替换示例图片路径为您的本地图片路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值