在图像处理领域中,二值化操作是一种非常基础且重要的技术。它将灰度图像或彩色图像转换为仅包含两种像素值的图像,即黑色和白色(或者更一般地说,前景和背景)。这种操作在处理图像时极大地简化了图像数据的复杂度,使得后续的图像分析和处理步骤变得更加高效和直观。
二值化操作的核心在于选择一个合适的阈值,这个阈值决定了哪些像素值被归为前景(通常是白色),哪些被归为背景(通常是黑色)。阈值的选择可以根据具体需求采用固定值、自适应算法或基于图像统计的方法来确定。
本文旨在介绍如何使用Python及其图像处理库来实现图像的二值化操作,包括基础的二值化方法、自适应阈值方法以及一些高级技巧。通过学习和实践这些技术,你将能够更好地理解和应用二值化在图像处理中的重要作用。
通过基本的像素处理图像的遍历可以实现设置阈值将图片二值化:
import cv2
def main(filename):
img = cv2.imread(filename,flags=0)
for i in range(len(img)):
for j in range(len(img[i])):
if img[i][j] < 150:
img[i][j] = 0
else:
img[i][j] = 255
cv2.imshow('window',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
main('f1.png')
如图即为二值化后的图片,例如在检测牙垢,拍胸片等方面可以更加便于观察。
在以上的代码中,设置阈值为150,即低于阈值的相对来说更加暗一点,那么就让它变得更暗。反之变得更亮。
如果我们想让亮的地方变暗,暗的地方变亮,只需要把if的判断条件修改为img[i][j]>150即可
import cv2
def main(filename):
img = cv2.imread(filename,flags=0)
for i in range(len(img)):
for j in range(len(img[i])):
if img[i][j] > 150:
img[i][j] = 0
else:
img[i][j] = 255
cv2.imshow('window',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
main('f1.png')
而在python的opencv包中也提供了一些方法,让我们快速将图片二值化,同时设置阈值。
import cv2
def main(filename):
img = cv2.imread(filename,flags=0)
t,img = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow('window',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
main('f1.png')
这样就可以更快得将图片二值化,如果想反二值化,就把最后一个参数设置为cv2.THRESH_BINARY_INV