图像二值化在图像处理中具有多种作用,包括但不限于以下几个方面:
-
分割图像:将图像分为目标和背景两部分,使得目标与背景的区分更加清晰,便于后续的图像分析和处理。
-
特征提取:二值化可以突出图像中的一些特征,如边缘、纹理等,有利于后续的特征提取和图像识别。
-
减少数据量:将图像转换为二值图像可以大大减少数据量,节省存储和传输成本。
-
图像增强:通过二值化可以突出感兴趣的目标,增强图像的对比度和特征,使得图像更加清晰和易于分析。
-
图像预处理:在一些图像处理任务中,如字符识别、图像分割等,二值化是一种常用的预处理方法,可以提高后续处理的准确性和效率。
总的来说,图像二值化的作用主要是对图像进行分割、特征提取和增强,以便于后续的图像分析和处理。
图像处理二值化介绍
下面是Python脚本,主要用于使用OpenCV库读取图像并进行简单的二值化处理,然后使用matplotlib库展示原始图像和处理后的图像。
# -*-coding:GBK -*-
# coding = utf-8
import cv2
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import math
具体功能如下:
-
# -*-coding:GBK-*-
:这是注释,用于指定文件的编码格式为GBK,但是由于后面有# coding = utf-8
,因此实际上会使用UTF-8编码。 -
导入所需的库:
cv2
:OpenCV库,用于图像处理。matplotlib.pyplot
和matplotlib
:用于绘制图像。numpy
:用于处理图像数据。
-
读取图像:使用
cv2.imread()
函数读取图像文件,该函数会返回一个表示图像的多维数组。 -
灰度处理:使用
cv2.cvtColor()
函数将读取的彩色图像转换为灰度图像。 -
二值化处理:使用自定义的二值化方法对灰度图像进行二值化处理。
-
展示图像:使用
matplotlib.pyplot.imshow()
函数分别展示原始图像和处理后的图像。
需要注意的是,如果解释器中没有相应的文件脚本,需要使用pip命令下载。
目录
- 灰度值返图最大熵法
- 迭代法
- 自适应法
- OTSU阈值处理法
1. 灰度值返图最大熵法
灰度值返图最大熵法是一种基于最大熵原理的二值化方法。它的原理是通过最大化图像的熵来确定最佳的阈值,从而将图像二值化。其步骤如下:
1.1 确定灰度直方图
首先,计算图像的灰度直方图,即统计每个灰度级别的像素点个数。
1.2 计算图像熵
根据灰度直方图,计算图像的熵。图像的熵可以用以下公式表示: [ H = -\sum_{i=0}^{L-1} p_i \log(p_i) ] 其中,( p_i ) 是第i个灰度级别的像素点数占总像素点数的比例,L是灰度级别的数量。
1.3 寻找最大熵
通过遍历所有可能的阈值,计算每个阈值对应的图像熵,找到使图像熵最大的阈值作为最佳的二值化阈值。
def threshEntropy(image):
rows, cols = image.shape
#求灰度直方图
grayHist = caleGrayHist(image)
#归一化灰度直方图,即概率直方图
normGrayHist = grayHist/float(rows*cols)
#第一步:计算累加直方图,也成为零阶累矩阵
zeroCumuMoment = np.zeros([256], np.float32)
for k in range(256):
if k == 0 :
zeroCumuMoment[k] = normGrayHist[k]
else:
zeroCumuMoment[k] = zeroCumuMoment[k-1] + normGrayHist[k]
#第二步:计算各个灰度级的熵
entropy = np.zeros([256], np.float32)
for k in range(256):
if k == 0 :
if normGrayHist[k] == 0 :
entropy[k] = 0
else:
entropy[k] = - normGrayHist[k] * math.log10(normGrayHist[k])
else:
if normGrayHist[k] == 0 :
entropy[k] = entropy[k-1]
else:
entropy[k] = entropy[k-1] - normGrayHist[k] * math.log10(normGrayHist[k])
#第三步:找阈值
fT = np.zeros([256], np.float32)
ft1, ft2 = 0.0, 0.0
totalEntropy = entropy[255]
for k in range(255):
#找最大值
maxFront = np.max(normGrayHist[0:k+1])
maxBack = np.max(normGrayHist[k+1:256])
if maxFront==0 or zeroCumuMoment[k]==0 or maxFront==1 or zeroCumuMoment[k]==1 or totalEntropy==0 :
ft1 = 0
else:
ft1 = entropy[k]/totalEntropy*(math.log10(zeroCumuMoment[k])/math.log10(maxFront))
if maxBack==0 or 1-zeroCumuMoment[k]==0 or maxBack==1 or 1-zeroCumuMoment[k]==1 :
ft2 = 0
else:
if totalEntropy == 0 :
ft2 = (math.log10(1-zeroCumuMoment[k])/math.log10(maxBack))
else:
ft2 = (1-entropy[k]/totalEntropy)*(math.log10(1-zeroCumuMoment[k])/math.log10(maxBack))
fT[k] = ft1 + ft2
#找到最大值索引
threshLoc = np.where(fT==np.max(fT))
thresh = threshLoc[0][0]
#阈值处理
threshold = np.copy(image)
threshold[threshold > thresh] = 255
threshold[threshold <= thresh] = 0
return (thresh, threshold)
img = cv2.imread('median.jpg', cv2.IMREAD_GRAYSCALE)
the, dst4 = threshEntropy(img)
the1 = 0
maxval = 255
the1, dst1 = cv2.threshold(img, the1, maxval, cv2.THRESH_TRIANGLE + cv2.THRESH_BINARY)
print('The thresh is :', the)
print('The thresh1 is :', the1)
cv2.imshow("image", img)
cv2.imshow('thresh_out', dst4)
cv2.imshow('thresh_out1', dst1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('最大熵.jpg',dst1)
2. 迭代法
迭代法是一种简单直观的二值化方法。其步骤如下:
2.1 初始化阈值
首先,初始化一个阈值T。
2.2 计算两个类的平均灰度
根据阈值T,将图像分为两个类,分别计算两个类的平均灰度值。
2.3 更新阈值
将两个类的平均灰度值的平均值作为新的阈值T,重复步骤2.2,直到阈值不再变化为止。
def show(img):
if img.ndim == 2:
plt.imshow(img, cmap='gray', vmin=0, vmax=255)
else:
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
img = cv2.imread('median.jpg', 0)
T = img.mean()
while True:
t0 = img[img < T].mean()
t1 = img[img >= T].mean()
t = (t0 + t1) / 2
if abs(T - t) < 1:
break
T = t
T = int(T)
print(f"Best threshold = {T}")
th, img_bin = cv2.threshold(img, T, 255, 0)
cv2.imshow('thresh_out1', img_bin)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('迭代.jpg',img_bin)
3. 自适应法
自适应法是一种根据局部像素灰度分布自适应调整阈值的二值化方法。其步骤如下:
3.1 确定局部窗口大小
首先,确定一个局部窗口的大小。
3.2 计算局部阈值
对于图像中的每个像素点,以其为中心取局部窗口,计算局部窗口内的灰度均值作为该像素点的阈值。
3.3 二值化
根据计算得到的局部阈值,对图像进行二值化处理。
img = cv2.imread('median.jpg', cv2.IMREAD_GRAYSCALE)
dst = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 43, 0.15)
cv2.imshow("image", img)
cv2.imshow('thresh_out', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('自适应.jpg',dst)
4. OTSU阈值处理
OTSU阈值处理法是一种基于类间方差最大化的二值化方法。其步骤如下:
4.1 计算类间方差
遍历所有可能的阈值,计算每个阈值对应的类间方差,找到使类间方差最大的阈值作为最佳的二值化阈值。
4.2 二值化
根据最佳的二值化阈值,对图像进行二值化处理。
以上就是对图像处理二值化的介绍,包括灰度值返图最大熵法、迭代法、自适应法、OTSU阈值处理法的详细说明和公式。希望能帮助你更好地理解图像二值化的原理和方法。
src = cv2.imread('image_bilater.jpg', cv2.IMREAD_GRAYSCALE)
triThe = 0
maxval = 255
triThe, dst_tri2 = cv2.threshold(src, triThe, maxval, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
triThe1, dst_tri1 = cv2.threshold(src, triThe, maxval, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
print (triThe)
print (triThe1)
cv2.imshow("image", src)
cv2.imshow('thresh_out', dst_tri2)
cv2.imshow('thresh_out1', dst_tri1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('image_otsu.jpg',dst_tri2)