opencv基础学习

3.3OTSU阈值

opencv基础学习_第1张图片

代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('./image/otus.png',0)
#简单阈值

ret1,th1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
#二值化阈值

ret2,th2=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#高斯去噪后二值化处理

blur=cv2.GaussianBlur(img,(5,5),0)
ret3,th3=cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
images = [img, 0, th1,img, 0, th2,blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)', 'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"] # 这里使用了pyplot 中画直方图的方法,

# plt.hist, 要注意的是它的参数是一维数组

# 所以这里使用了(numpy)ravel 方法,将多维数组转换成一维,也可以使用 flatten 方法

#ndarray.flat 1-D iterator over an array.
#ndarray.flatten 1-D array copy of the elements of an array in row-majororder.
for i in range(3):
    plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
    plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
    plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
    plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
    plt.show()

1. 导入库

  • import cv2:导入 OpenCV 库,用于图像处理操作,如读取图像、阈值处理、高斯滤波等。
  • import numpy as np:导入 NumPy 库,用于数值计算和数组操作,这里主要用于将多维数组转换为一维数组以绘制直方图。
  • from matplotlib import pyplot as plt:导入 Matplotlib 的 pyplot 模块,用于绘制和显示图像以及直方图。

2. 读取图像

  • img = cv2.imread('./image/otus.png', 0):使用cv2.imread函数读取指定路径'./image/otus.png'下的图像文件,并以灰度模式(0参数)读取,将图像存储在变量img中。

3. 简单阈值处理

  • ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY):对灰度图像img进行简单的二值化阈值处理。
    • 127是设定的阈值。
    • 255是最大值。
    • cv2.THRESH_BINARY表示阈值类型为二值化,即大于阈值的像素设置为最大值255(白色),小于等于阈值的像素设置为0(黑色),处理结果存储在th1中,ret1是返回的阈值(这里未使用)。

4. 二值化阈值(Otsu's 方法)

  • ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU):使用 Otsu's 方法对灰度图像img进行二值化阈值处理。
    • 0是初始阈值,Otsu's 方法会自动计算最优阈值。
    • 255是最大值。
    • cv2.THRESH_BINARY + cv2.THRESH_OTSU表示同时使用二值化和 Otsu's 方法,处理结果存储在th2中,ret2是返回的自动计算得到的最优阈值(这里未使用)。

5. 高斯去噪后二值化处理(Otsu's 方法)

  • blur = cv2.GaussianBlur(img, (5, 5), 0):对灰度图像img进行高斯滤波去噪,卷积核大小为(5, 5)0是标准差(自动计算),滤波后的图像存储在blur中。
  • ret3, th3 = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU):对去噪后的图像blur使用 Otsu's 方法进行二值化阈值处理,处理方式与上述步骤 4 相同,结果存储在th3中,ret3是返回的最优阈值(这里未使用)。

6. 设置图像和标题列表

  • images = [img, 0, th1, img, 0, th2, blur, 0, th3]:创建一个图像列表,按顺序存储原始图像、用于占位的0(可能是为了在循环中对应直方图的位置)、简单阈值处理后的图像、原始图像、用于占位的0、Otsu's 阈值处理后的图像、高斯滤波后的图像、用于占位的0、高斯滤波后 Otsu's 阈值处理后的图像。
  • titles = ['Original Noisy Image', 'Histogram', 'Global Thresholding (v=127)', 'Original Noisy Image', 'Histogram', "Otsu's Thresholding", 'Gaussian filtered Image', 'Histogram', "Otsu's Thresholding"]:创建一个标题列表,分别对应原始含噪图像、直方图、全局阈值处理(阈值为 127)、原始含噪图像、直方图、Otsu's 阈值处理、高斯滤波图像、直方图、高斯滤波后 Otsu's 阈值处理。

7. 使用 Matplotlib 显示图像和直方图

  • for i in range(3)::通过循环遍历三次,每次处理一组图像和直方图。
  • plt.subplot(3, 3, i * 3 + 1), plt.imshow(images[i * 3], 'gray'):创建一个 3 行 3 列的子图布局,在第i * 3 + 1个位置显示原始图像或滤波后的图像,使用灰度颜色映射('gray')。
  • plt.title(titles[i * 3]), plt.xticks([]), plt.yticks([]):设置该子图的标题为对应的标题列表中的标题,并关闭 x 轴和 y 轴的刻度显示。
  • plt.subplot(3, 3, i * 3 + 2), plt.hist(images[i * 3].ravel(), 256):在第i * 3 + 2个位置绘制对应图像的直方图,使用ravel方法将多维数组转换为一维数组,256是直方图的 bins 数量。
  • plt.title(titles[i * 3 + 1]), plt.xticks([]), plt.yticks([]):设置该子图的标题为对应的标题列表中的标题,并关闭 x 轴和 y 轴的刻度显示。
  • plt.subplot(3, 3, i * 3 + 3), plt.imshow(images[i * 3 + 2], 'gray'):在第i * 3 + 3个位置显示阈值处理后的图像,使用灰度颜色映射。
  • plt.title(titles[i * 3 + 2]), plt.xticks([]), plt.yticks([]):设置该子图的标题为对应的标题列表中的标题,并关闭 x 轴和 y 轴的刻度显示。
  • plt.show():显示所有子图。

你可能感兴趣的:(OpenCV基础全集,opencv,学习,人工智能)