在用python进行图像处理时,二值化是非常重要的一步,现总结了自己遇到过的6种 图像二值化的方法(当然这个绝对不是全部的二值化方法,若发现新的方法会继续新增)。
1. opencv 简单阈值 cv2.threshold
2. opencv 自适应阈值 cv2.adaptiveThreshold (自适应阈值中计算阈值的方法有两种:mean_c 和 guassian_c ,可以尝试用下哪种效果好)
3. Otsu's 二值化
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread( 'scratch.png' , 0 ) # global thresholding ret1, th1 = cv2.threshold(img, 127 , 255 , cv2.THRESH_BINARY) # Otsu's thresholding th2 = cv2.adaptiveThreshold(img, 255 , cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11 , 2 ) # Otsu's thresholding # 阈值一定要设为 0 ! ret3, th3 = cv2.threshold(img, 0 , 255 , cv2.THRESH_BINARY + cv2.THRESH_OTSU) # plot all the images and their histograms images = [img, 0 , th1, img, 0 , th2, img, 0 , th3] titles = [ 'Original Noisy Image' , 'Histogram' , 'Global Thresholding (v=127)' , 'Original Noisy Image' , 'Histogram' , "Adaptive Thresholding" , 'Original Noisy 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-major order. 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() |
结果图:
4. skimage niblack阈值
5. skimage sauvola阈值 (主要用于文本检测)
例子:
https://scikit-image.org/docs/dev/auto_examples/segmentation/plot_niblack_sauvola.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
import matplotlib import matplotlib.pyplot as plt from skimage.data import page from skimage.filters import (threshold_otsu, threshold_niblack, threshold_sauvola) matplotlib.rcParams[ 'font.size' ] = 9 image = page() binary_global = image > threshold_otsu(image) window_size = 25 thresh_niblack = threshold_niblack(image, window_size = window_size, k = 0.8 ) thresh_sauvola = threshold_sauvola(image, window_size = window_size) binary_niblack = image > thresh_niblack binary_sauvola = image > thresh_sauvola plt.figure(figsize = ( 8 , 7 )) plt.subplot( 2 , 2 , 1 ) plt.imshow(image, cmap = plt.cm.gray) plt.title( 'Original' ) plt.axis( 'off' ) plt.subplot( 2 , 2 , 2 ) plt.title( 'Global Threshold' ) plt.imshow(binary_global, cmap = plt.cm.gray) plt.axis( 'off' ) plt.subplot( 2 , 2 , 3 ) plt.imshow(binary_niblack, cmap = plt.cm.gray) plt.title( 'Niblack Threshold' ) plt.axis( 'off' ) plt.subplot( 2 , 2 , 4 ) plt.imshow(binary_sauvola, cmap = plt.cm.gray) plt.title( 'Sauvola Threshold' ) plt.axis( 'off' ) plt.show() |
结果图:
6.IntegralThreshold(主要用于文本检测)
使用方法: 运行下面网址的util.py文件
https://github.com/Liang-yc/IntegralThreshold
结果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/ttweixiao-IT-program/p/12091820.html