常见的图像处理操作

这篇博客介绍了图像处理的基础操作,包括阈值处理(二值化、反转、截断、置零)、平滑滤波(均值、方框、高斯、中值)以及形态学操作(腐蚀、膨胀、开闭运算、梯度、礼帽和黑帽)。通过这些方法可以去除图像噪声、突出关键特征,并进行边缘检测和形状分析。
摘要由CSDN通过智能技术生成

图像阈值

# src:输入图,只能输入单通道图像,通常来说为灰度图
# dst: 输出图
# thresh: 阈值
# maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
# type: 二值化操作的类型,包含以下五种类型:cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV,
# cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV
# 返回的第一个参数ret是阈值,第二个参数是处理后的图片
ret, dst = cv2.threshold(src, thresh, maxval, type)
import matplotlib as plt
import cv2
import numpy as np

# 将图片以灰度图的形式读入
img = cv2.imread('D:/python/opencv/data/image/test_videos_2_7.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# cv2.THRESH_BINARY_INV 是cv2.THRESH_BINARY的反转
ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
# cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
# cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
# cv2.THRESH_TOZERO_INV 是cv2.THRESH_TOZERO的反转
ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow('BINARY', thresh5)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像平滑处理

均值滤波

# 使用一个(3,3)的各个值为1的矩阵取求平均值
blur = cv2.blur(img, (3, 3))

方框滤波

# -1表示通道数和原img一样,一般都使用-1.
# 使用normalize=True后,进行归一化处理,处理效果和均值滤波一样
box = cv2.boxFilter(img, -1, (3, 3), normalize=True)
cv2.imshow('box', box)
# 使用normalize=False后,没有进行归一化处理,只是将(3,3)
# 中的像素相加,若最后大于255,都当作255处理
box = cv2.boxFilter(img, -1, (3, 3), normalize=False)
cv2.imshow('box', box)

高斯滤波

# (5,5)表示高斯矩阵的长和宽,1表示标准差取1
gaussian = cv2.GaussianBlur(img, (5, 5), 1)
cv2.imshow('gaussian', gaussian)

中值滤波

# 5表示矩阵为(5,5),将取到的25个值排序,取中间值
median = cv2.medianBlur(img, 5)
cv2.imshow('median', median)

小技巧

# 同时展示所有的
# 将所有的图片水平的拼接在一起
# res = np.hstack((blur, box, gaussian, median))
# 将所有的图片竖直的拼接在一起
res = np.vstack((blur, box, gaussian, median))
cv2.imshow('all', res)

形态学

腐蚀操作

# np.ones()表示返回一个全1的数组
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
cv2.imshow('erosion', erosion

对比迭代次数不一样的腐蚀操作

kernel = np.ones((30, 30), np.uint8)
erosion_1 = cv2.erode(img, kernel, iterations=1)
erosion_2 = cv2.erode(img, kernel, iterations=2)
erosion_3 = cv2.erode(img, kernel, iterations=3)
res = np.hstack((erosion_1, erosion_2, erosion_3))
cv2.imshow('res', res)

膨胀操作

kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
dilate = cv2.dilate(erosion, kernel, iterations=1)
cv2.imshow('dilate', dilate)

注:经过腐蚀操作和膨胀操作,可以将图像中的一些毛刺去掉

开运算和闭运算

# 开:先腐蚀,后膨胀
# 开运算可以将毛刺腐蚀掉
kernel = np.ones((5,5), np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
# 闭:先膨胀,后腐蚀
# 不仅不能把毛刺腐蚀掉,反而使毛刺变得更大
kernel = np.ones((5,5), np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)

梯度运算

# 梯度运算:膨胀-腐蚀,得到的是一个轮廓
kernel = np.ones((5,5), np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)

礼帽和黑帽

礼帽:原始输入-开运算结果,即显示毛刺

kernel = np.ones((5,5), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)

黑帽:闭运算结果-原始输入,即显示轮廓

kernel = np.ones((5,5), np.uint8)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值