百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python-OpenCV 7. 图像二值化

itomcoil 2025-05-22 11:00 2 浏览

一、介绍

图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
图像的二值化处理就是将图像上的点的灰度值为0或255,也就是将整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。

(摘自百度百科)

二、实现原理

一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。

Python-OpenCV中提供了阈值(threshold)函数:

threshold(src, thresh, maxval, type[, dst]) -> retval, dst

函数:

  • src 指原图像,原图像应该是灰度图。
  • thresh 阈值
  • maxval 表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值
  • type 表示阈值类型
  • retval参数表示返回的阈值。若是全局固定阈值算法,则返回thresh参数值。若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。
  • dst参数表示输出与src相同大小和类型以及相同通道数的图像。

cv2.thresh_otsu类型

  • 第一返回值,得到图像的阈值,
  • 第二个返回值,也就是阈值处理后的图像,

adaptiveThreshold方法

def adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None): # real signature unknown; restored from __doc__

OpenCV的adaptiveThreshold函数进行局部阈值。函数原型为:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

  • src参数表示输入图像(8位单通道图像)。
  • maxValue参数表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.
  • adaptiveMethod参数表示自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)。
  • thresholdType参数表示阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型。
  • blockSize参数表示块大小(奇数且大于1,比如3,5,7........ )。

C参数是常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值。

三、OpenCV代码实现

1. OpenCV 阈值函数DEMO

# -*- coding: utf-8 -*-
import cv2
image = cv2.imread('test.jpg')
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
cv2.threshold(image, 140, 255, 0, image)
cv2.imshow("Image", image)
cv2.waitKey(0)

2. 全局阈值使用THRESH_OTSU

# -*- coding: utf-8 -*-
import cv2
image = cv2.imread('test.jpg')
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
ret, binary = cv2.threshold(image, 140, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU, image)
print("threshold value: %s" % ret) # 打印阈值,前面先进行了灰度处理0-255,我们使用该阈值进行处理,低于该阈值的图像部分全为黑,高于该阈值则为白色
cv2.imshow("Image", binary)
cv2.waitKey(0)

3. 全局阈值使用THRESH_TRIANGLE 三角形算法

ret, binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)

4. 全局阈值,指定阈值,大于指定阈值都为0

ret, binary = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY_INV)

5. 全局阈值,指定阈值,大于127都为127

ret, binary = cv2.threshold(image, 127, 255, cv2.THRESH_TRUNC)

6. 全局阈值,小于阈值的都为0

ret, binary = cv2.threshold(image, 127, 255, cv2.THRESH_TOZERO)

7. 局部阈值 ADAPTIVE_THRESH_MEAN_C

# -*- coding: utf-8 -*-
import cv2
image = cv2.imread('test.jpg')
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
dst = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 25, 10)
cv2.imshow("Image", dst)
cv2.waitKey(0)

8. 局部阈值
ADAPTIVE_THRESH_GAUSSIAN_C

# -*- coding: utf-8 -*-
import cv2
image = cv2.imread('test.jpg')
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
dst = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 10)
cv2.imshow("Image", dst)
cv2.waitKey(0)

四、numpy运算

1. 使用中间阈值127

# -*- coding: utf-8 -*-
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 显示图片
def showimg(img, isgray=False):
 plt.axis("off")
 if isgray == True:
 plt.imshow(img, cmap='gray')
 else:
 plt.imshow(img)
 plt.show()
im = Image.open("test.jpg")
im = np.array(im.convert('L'))
im = np.where(im[..., :] < 127, 0, 255)
showimg(Image.fromarray(im), True)

2. 取所有像素点灰度的平均值

# -*- coding: utf-8 -*-
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 显示图片
def showimg(img, isgray=False):
 plt.axis("off")
 if isgray:
 plt.imshow(img, cmap='gray')
 else:
 plt.imshow(img)
 plt.show()
im = Image.open("test.jpg")
im = np.array(im.convert('L'))
im = np.array(im)
avg_gray = np.average(im)
im = np.where(im[..., :] < avg_gray, 0, 255)
showimg(Image.fromarray(im), True)

相关推荐

使用opencv-Python进行图像锐化处理

使用OpenCV函数cv::filter2D执行一些拉普拉斯滤波以进行图像锐化使用OpenCV函数cv::distanceTransform以获得二值图像的派生(derived)表示,...

Python-OpenCV 7. 图像二值化

一、介绍图像二值化(ImageBinarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。在数字图像处理中,二值图像占有非常重要的地位,图...

OpenCV+Python裁剪图像

最近使用OpenCV+Python做了一个程序,功能是自动将照片中的文本部分找出来并裁剪/旋转保存为新的图片。这个功能用专业些的说法就是选择并提取感兴趣区域(ROI(RegionofInteres...

简单易懂的人脸识别!用PythonOpenCV实现(适合初...

前言:OpenCV是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV已被广泛运用在各种项目上,从谷歌街景...

OpenCV行人检测应用方案--基于米尔全志T527开发板

本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志T527开发板)的OpenCV行人检测方案测试。摘自优秀创作者-小火苗一、软件环境安装1.在全志T527开发板安装OpenCVsudoap...

纯Python构建Web应用:Remi与 OpenCV 结合实现图像处理与展示

引言大家好,我是ICodeWR。在前几篇文章中,我们介绍了Remi的基础功能、多页面应用、动态更新、与Flask结合、与数据库结合、与Matplotlib结合以及与Pandas结合。...

【AI实战项目】基于OpenCV的“颜色识别项目”完整操作过程

OpenCV是一个广受欢迎且极为流行的计算机视觉库,它因其强大的功能、灵活性和开源特性而在开发者和研究者中备受青睐。学习OpenCV主要就是学习里面的计算机视觉算法。要学习这些算法的原理,知道它们适用...

Python自动化操控术:PyAutoGUI全场景实战指南

一、PyAutoGUI核心武器库解析1.1鼠标操控三剑客importpyautogui#绝对坐标移动(闪电速度)pyautogui.moveTo(100,200,duration=0....

从零开始学python爬虫(七):selenium自动化测试框架的介绍

本节主要学习selenium自动化测试框架在爬虫中的应用,selenium能够大幅降低爬虫的编写难度,但是也同样会大幅降低爬虫的爬取速度。在逼不得已的情况下我们可以使用selenium进行爬虫的编写。...

「干货分享」推荐5个可以让你事半功倍的Python自动化脚本

作者:俊欣来源:关于数据分析与可视化相信大家都听说自动化流水线、自动化办公等专业术语,在尽量少的人工干预的情况下,机器就可以根据固定的程序指令来完成任务,大大提高了工作效率。今天小编来为大家介绍几个P...

python+selenium+pytesseract识别图片验证码

一、selenium截取验证码#私信小编01即可获取大量Python学习资源#私信小编01即可获取大量Python学习资源#私信小编01即可获取大量Python学习资源importjso...

Python爬虫实战 | 利用多线程爬取 LOL 高清壁纸

一、背景介绍随着移动端的普及出现了很多的移动APP,应用软件也随之流行起来。最近看到英雄联盟的手游上线了,感觉还行,PC端英雄联盟可谓是爆火的游戏,不知道移动端的英雄联盟前途如何,那今天我们使用到...

一套真实的Python面试题,几十个题目汇总

1.(1)python下多线程的限制以及多进程中传递参数的方式python多线程有个全局解释器锁(globalinterpreterlock),这个锁的意思是任一时间只能有一个线程使用解释器,跟...

一文读透,Python暴力(BF)字符串匹配算法到 KMP 算法之间的变化

1.字符串匹配算法所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串。如在字符串"ABCDEFG"中查找是否存在“EF”字符串。可以把字符...

Python实现屏幕自动截图

教程目录需要实现的功能:自动屏幕截图具体需求:1.支持设置截图频率和截图文件存储路径2.在存储截图时判断与前一张截图的相似度,只有屏幕发生了显著的变化才存储截图所需技术(搜索关键词):1.屏幕截...