一、点运算(灰度变换)
点运算是指对图像中每个像素的灰度值独立进行变换,输出像素值仅依赖于输入像素值,与周围像素无关。
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()
四、总结
-
点运算:改变单个像素的灰度值,用于对比度调整、亮度校正等
-
代数运算:多幅图像之间的像素级运算,用于图像融合、运动检测等
-
组合应用:点运算和代数运算常组合使用完成复杂图像处理任务
注意:实际运行代码时需要替换示例图片路径为您的本地图片路径。
-