OpenCV-python图像处理(包含OpenCV库安装)
1.灰度直方图
2.原图
3.灰度图
4.反转图像
5.二值化图像
6.边缘检测
7.均值迁移模糊
8.双边滤波
可正常运行,需要安装对应的库。安装如下:(在虚拟环境中或终端)
OpenCV安装,使用清华镜像源:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/
matplotlib安装,使用清华镜像源:
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/
纯代码,无名词概念解释。需要的自行百度。
(测试时版本:python:3.10,cv2:4.7.0,matplotlib:3.7.1)
import cv2
from matplotlib import pyplot as plt
import matplotlib
def image_processing(image_input):
# cv2.normalize(image_input, image_input, 0, 255, cv2.NORM_MINMAX) # 将图片的值进行范围调整,使用的放缩方式是 min_max 的方式
#cv2.convertScaleAbs(image_input, image_input) #图像增强
image_H = cv2.cvtColor(image_input, cv2.COLOR_BGR2GRAY) #将图像转为灰度图
image_F = cv2.bitwise_not(image_input) #图像反转,黑变白,白变黑
threshold, image_B = cv2.threshold(image_H, 0, 255, cv2.THRESH_OTSU) #输出阈值和二值化图像
'''
自行设置阈值:(通过修改第2,3个参数)
THRESH_BINARY 超过阈值的值为最大值,其他值是0。THRESH_BINARY_INV 超过阈值的值为0,其他值为最大值。
THRESH_TRUNC 超过阈值的值等于阈值,其他值不变。THRESH_TOZERO 超过阈值的值不变,其他值为0。
THRESH_TOZERO_INV 超过阈值的值为0,其他值不变。
自动获取阈值:
THRESH_OTSU:适用于双波峰。
THRESH_TRIANGLE:适用于单波峰。
'''
image_C = cv2.Canny(image_H, 0, 256, L2gradient=True) #边缘检测
'''
image:要进行边缘检测的输入图像(单通道)。
threshold1:第一个阈值,用于边缘检测中的滞后阈值。
threshold2:第二个阈值,用于边缘检测中的滞后阈值。
edges:可选,用于存储边缘检测的结果。
apertureSize:可选,Sobel算子的大小。
L2gradient:可选,True:使用L2范数运算,False:使用L1范数运算。
'''
image_M = cv2.pyrMeanShiftFiltering(image_input, 15, 50, 1, termcrit=(cv2.TERM_CRITERIA_MAX_ITER+cv2.TERM_CRITERIA_EPS, 5, 1)) #均值迁移模糊
'''
src:输入图像,8位,三通道的彩色图像,不要求必须是RGB格式。
sp:漂移物理空间半径大小。
sr:漂移色彩空间半径大小。
maxLevel:可选,金字塔的最大层数。
termcrit:可选,迭代终止条件,迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合,由最后两位参数确定。
'''
image_S = cv2.bilateralFilter(image_input, 0, 10, 50) #双边滤波
'''
src:输入图像,单通道或三通道。
d:邻域的直径,如果是小于等于 0,则由 sigmaSpace 计算得到。
sigmaColor:颜色空间滤波器的标准差。值越大表示邻域中更多的颜色被混合。
sigmaSpace:空域滤波器的标准差。更大的值代表更大范围内的像素(颜色相近)会被相互影响。
当 d 大于 0 的时候,sigmaSpace 被忽略,否则 d 由 sigmaSpace 计算得到。
borderType:外延模式。
'''
image = cv2.cvtColor(image_input, cv2.COLOR_BGR2RGB)
image_H = cv2.cvtColor(image_H, cv2.COLOR_BGR2RGB) # cv2 读取的是 [B,G,R] ,转化成顺序为 [R,G,B] 的格式
image_B = cv2.cvtColor(image_B, cv2.COLOR_BGR2RGB)
image_C = cv2.cvtColor(image_C, cv2.COLOR_BGR2RGB)
image_M = cv2.cvtColor(image_M, cv2.COLOR_BGR2RGB)
image_S = cv2.cvtColor(image_S, cv2.COLOR_BGR2RGB)
return image, image_H, image_F, image_B, image_C, image_M, image_S
if __name__ == "__main__":
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来显示中文,若无此字体可自行下载或将标签改为英文 plt.title('峰值图')
# plt.rcParams['axes.unicode_minus'] = False # 用来显示负号
image = cv2.imread("可莉.png") #图片地址,相对路径即可。
image_New = image_processing(image)
'''显示图像'''
plt.subplot(4, 2,1)
plt.hist(image.ravel(), 256)
plt.axis('on') #坐标轴
plt.title('灰度直方图') #标签
plt.subplot(4, 2, 2)
plt.imshow(image_New[0])
plt.axis('off')
plt.title('原图')
plt.subplot(4, 2, 3)
plt.imshow(image_New[1])
plt.axis('off')
plt.title('灰度图')
plt.subplot(4, 2, 4)
plt.imshow(image_New[2])
plt.axis('off')
plt.title('反转图像')
plt.subplot(4, 2, 5)
plt.imshow(image_New[3])
plt.axis('off')
plt.title('二值化图像')
plt.subplot(4, 2, 6)
plt.imshow(image_New[4])
plt.axis('off')
plt.title('边缘检测')
plt.subplot(4, 2, 7)
plt.imshow(image_New[5])
plt.axis('off')
plt.title('均值迁移模糊')
plt.subplot(4, 2, 8)
plt.imshow(image_New[6])
plt.axis('off')
plt.title('双边滤波')
plt.tight_layout() #自动调整子图间距
plt.show()
新手上路,望批评指正,一起讨论。