图像去噪学习

图像噪声

椒盐噪声:图像中随机出现的白点或黑点。

高斯噪声:噪声的概率密度分布是正态分布。

均值滤波

优点:算法简单,计算速度较快。缺点:在去噪的同时去除了很多细节部分,将图像变得模糊。

cv.blur(src,ksize,anchor,borderType)

src:输入图像

ksize:卷积核的大小

anchor:默认值(-1,-1),表示核中心

borderType:边界类型

import numpy as np
import cv2 as cv
import matplotlib
matplotlib.use('Agg')  # 设置非交互式后端
import matplotlib.pyplot as plt

img = cv.imread("./image/p4.png")
# 均值滤波
blur = cv.blur(img,(5,5))
# 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('Original')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blur')
plt.xticks([]),plt.yticks([])
plt.tight_layout()

plt.savefig('result4.png')  # 保存到当前工作目录
plt.close()  # 释放内存
print("图像已保存为 result4.png,请到当前目录查看。")

高斯滤波

去除高斯噪声

cv.GaussianBlur(src,ksize,sigmaX,sigmaY,border,borderType)

ksize:高斯卷积核的大小。注:卷积核的高度和宽度都应为奇数,且可以不同

sigmaX:水平方向的标准差

sigmaY:垂直方向的标准差,默认值为0,表示与sigmaX相同。

borderType:填充边界类型

import numpy as np
import cv2 as cv
import matplotlib
matplotlib.use('Agg')  # 设置非交互式后端
import matplotlib.pyplot as plt

img = cv.imread('./image/p5.png')
# 高斯滤波
blur = cv.GaussianBlur(img,(3,3),1)
# 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('Original')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blur')
plt.xticks([]),plt.yticks([])
plt.tight_layout()

plt.savefig('result5.png')  # 保存到当前工作目录
plt.close()  # 释放内存
print("图像已保存为 result5.png,请到当前目录查看。")

中值滤波

中值滤波对椒盐噪声来说尤其有用

cv.medianBlur(src,ksize)

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('./image/p6.png')
# 中值滤波
blur = cv.medianBlur(img,5)
# 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('Original')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blur')
plt.xticks([]),plt.yticks([])
plt.tight_layout()

plt.savefig('result6.png')  # 保存到当前工作目录
plt.close()  # 释放内存
print("图像已保存为 result6.png,请到当前目录查看。")

直方图

灰度直方图

直方图是图像中像素强度分布的图形表达方式,统计每一个强度值所具有的像素个数。

不同的图像的直方图可能是相同的。

cv.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])

images:原图像,当传入函数时应该用[]括起来。

channels:如果输入的图像是灰度值,它的值就是[0];如果为彩色图,传入的参数可以是[0],[1],[2],他们分别对应着通道B,G,R

mask:掩模图像

histSize:BIN的数目,也用[]括起来。

ranges:像素值范围,通常为[0,256]

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
# 显式设置Matplotlib后端为Agg(无GUI依赖)
plt.switch_backend('Agg')
# 直接以灰度图的方式读入
img = cv.imread('./image/p6.png', 0)
# 统计灰度图直方图
histr = cv.calcHist([img], [0], None, [256], [0, 256])
# 绘制灰度图直方图
plt.figure(figsize=(10, 6), dpi=100)
plt.plot(histr)
plt.grid(True)  # 添加网格线更清晰
plt.title('Grayscale Histogram')  # 添加标题
plt.xlabel('Pixel Intensity')     # 添加坐标轴标签
plt.ylabel('Frequency')
plt.savefig("histogram.png")

掩模的应用

掩模的主要作用:

  1. 提取感兴趣区域:感兴趣区内图像值不变,而区外图像值都为0。

  2. 屏蔽作用:用掩模对图像上某些区域作屏蔽。

  3. 结构特征提前:用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。

  4. 特殊形状图像制作

import numpy as np
import cv2 as cv
import matplotlib
matplotlib.use('Agg')  # 设置非交互式后端
import matplotlib.pyplot as plt
# 解决中文显示问题(如果需要)
plt.rcParams['font.family'] = 'SimHei'  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

img = cv.imread('./image/p6.png')
# 创建蒙版
mask = np.zeros(img.shape[:2], np.uint8)
mask[400:650,200:500]=255
# 掩模
masked_img = cv.bitwise_and(img,img, mask=mask)
# 统计掩模后图像的灰度图
mask_histr = cv.calcHist([img],[0],mask,[256],[0,256])
# 图像展示
fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0, 0].imshow(img, cmap=plt.cm.gray)
axes[0, 0].set_title("原图(p5)")
axes[0, 1].imshow(mask, cmap=plt.cm.gray)
axes[0, 1].set_title("蒙版数据")

axes[1, 0].imshow(masked_img, cmap=plt.cm.gray)
axes[1, 0].set_title("掩模后数据")

axes[1, 1].plot(mask_histr)
axes[1, 1].grid
axes[1, 1].set_title("灰度直方图")

# 调整布局并保存图像
plt.tight_layout()
plt.savefig('result7.png')  # 保存到当前工作目录
plt.close()  # 释放内存
print("图像已保存为 result7.png,请到当前目录查看。")

直方图均衡化

把原始图像的灰度值直方图从比较集中的某个灰度区间变成在更广泛灰度范围内的分布,提高图像整体的对比度,在曝光过度或不足的图像中可以更好的突出细节。

dst = cv.equalizeHist(img)

import numpy as np
import cv2 as cv
import matplotlib
matplotlib.use('Agg')  # 设置非交互式后端
import matplotlib.pyplot as plt
# 直接以灰度图的形式读入
img = cv.imread('./image/p5.png', 0)
# 均衡化处理
dst = cv.equalizeHist(img)
# 结果展示
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
# 在第一个子图显示原图
axes[0].imshow(img, cmap=plt.cm.gray)
axes[0].set_title('Original Image')
# 在第二个子图显示均衡化后的图像
axes[1].imshow(dst, cmap=plt.cm.gray)
axes[1].set_title('Equalized Image')

plt.tight_layout()
plt.savefig('result8.png')  # 保存到当前工作目录
plt.close()  # 释放内存
print("图像已保存为 result8.png,请到当前目录查看。")

自适应的直方图均衡化

cv.creatCLAHE(cliplimit,tileGridSize)

clipLimit:对比度限制,默认是0

tileGridSize:分块的大小,默认是8*8

import numpy as np
import cv2 as cv
import matplotlib
matplotlib.use('Agg')  # 设置非交互式后端
import matplotlib.pyplot as plt
# 直接以灰度图的形式读入
img = cv.imread('./image/p4.png', 0)
# 均衡化处理
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
# 结果展示
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
# 在第一个子图显示原图
axes[0].imshow(img, cmap=plt.cm.gray)
axes[0].set_title('Original Image')
# 在第二个子图显示均衡化后的图像
axes[1].imshow(cl1, cmap=plt.cm.gray)
axes[1].set_title('Equalized Image')

plt.tight_layout()
plt.savefig('result9.png')  # 保存到当前工作目录
plt.close()  # 释放内存
print("图像已保存为 result9.png,请到当前目录查看。")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值