【OpenCV C++&Python】(四)图像阈值处理

简介:

图像阈值处理

Python

简单阈值处理

OpenCV的cv.threshold用于简单阈值处理,它的第一个参数是灰度源图像src;第二个参数是阈值thresh;第三个参数是赋值给超过阈值的像素的最大值maxval;第四个参数则是阈值处理的类型:

cv.threshold返回两个输出。第一个是使用的阈值,第二个输出是阈值图像dst。下面比较不同类型的阈值处理方法:

import cv2 as cv
from matplotlib import pyplot as plt
import numpy as np

img = cv.imread('threshold.jpg', 0)
ret, thresh1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
ret, thresh2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
ret, thresh3 = cv.threshold(img, 127, 255, cv.THRESH_TRUNC)
ret, thresh4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO)
ret, thresh5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

自适应阈值处理

简单阈值处理在图像全局都使用同一个阈值,如果图像在不同区域有不同的照明条件,这可能就不适用了。在这种情况下,自适应阈值处理更适合。自适应阈值处理根据像素周围的一个小区域来确定阈值。可以使用OpenCV的cv.adaptiveThreshold实现这个功能。

cv.adaptiveThreshold的第一个参数是灰度源图像src;第二个参数是赋值给超过阈值的像素的最大值maxval

第三个参数adaptiveMethod决定如何计算阈值:

  • cv.ADAPTIVE_THRESH_MEAN_C:阈值是邻域内像素的平均值减去常数C
  • cv.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域内像素的高斯加权和减去常数C

第四个参数则是阈值处理的类型;第五个参数 blockSize决定邻域区域的大小;第六个参数是常数C

下面对比一下简单阈值处理和自适应阈值处理:

import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('adaptiveThreshold.jpg', 0)
ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
th2 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 11, 2)
th3 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2)

titles = ['Original Image', 'BINARY(v=127)',
          'ADAPTIVE_THRESH_MEAN_C', 'ADAPTIVE_THRESH_GAUSSIAN_C']
images = [img, th1, th2, th3]
for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

大津(Otsu)法

原理

使用cv.threshold()函数,阈值处理的类型可以任意选择,THRESH_OTSU作为一个额外的flag即可使用大津法。下面以一个直方图包含两个峰的图像(双峰图像)为例:

import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('coins.png', 0)
# 普通二值化
ret1, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
# Otsu法二值化
ret2, th2 = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)  # 随便给个0为阈值

images = [img, [], th1,
          img, [], th2]
titles = ['Original Image', 'Histogram', 'BINARY (v=127)',
          'Original Image', 'Histogram', 'OTSU(v=0)']
for i in range(2):
    plt.subplot(2, 3, i * 3 + 1), plt.imshow(images[i * 3], 'gray')
    plt.title(titles[i * 3]), plt.xticks([]), plt.yticks([])
    plt.subplot(2, 3, i * 3 + 2), plt.hist(images[i * 3].ravel(), 256)
    plt.title(titles[i * 3 + 1]), plt.xticks([]), plt.yticks([])
    plt.subplot(2, 3, i * 3 + 3), plt.imshow(images[i * 3 + 2], 'gray')
    plt.title(titles[i * 3 + 2]), plt.xticks([]), plt.yticks([])
plt.show()

大津法无需人工指定阈值即可达到较为理想的效果。

C++

简单阈值处理

#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
    Mat img = imread("threshold.jpg",0);
    Mat thresh1, thresh2, thresh3, thresh4, thresh5;
    
    threshold(img, thresh1, 127, 255, THRESH_BINARY);
    threshold(img, thresh2, 127, 255, THRESH_BINARY_INV);
    threshold(img, thresh3, 127, 255, THRESH_TRUNC);
    threshold(img, thresh4, 127, 255, THRESH_TOZERO);
    threshold(img, thresh5, 127, 255, THRESH_TOZERO_INV);

    imshow("Original Image", img);
    imshow("BINARY", thresh1);
    imshow("BINARY_INV", thresh2);
    imshow("TRUNC", thresh3);
    imshow("TOZERO", thresh4);
    imshow("TOZERO_INV", thresh5);
    waitKey(0);
    return 0;
}

自适应阈值处理

#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
    Mat img = imread("adaptiveThreshold.jpg",0);
    Mat thresh1, thresh2, thresh3;
    threshold(img, thresh1, 127, 255, THRESH_BINARY);
    adaptiveThreshold(img, thresh2,255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 11, 2);
    adaptiveThreshold(img, thresh3,255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 11, 2);

    imshow("Original Image", img);
    imshow("BINARY", thresh1);
    imshow("ADAPTIVE_THRESH_MEAN_C", thresh2);
    imshow("ADAPTIVE_THRESH_GAUSSIAN_C", thresh3);
    waitKey(0);
    return 0;
}

大津(Otsu)法

#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
    Mat img = imread("coins.png",0);
    Mat thresh1, thresh2;
    threshold(img, thresh1, 127, 255, THRESH_BINARY);
    threshold(img, thresh2, 0, 255, THRESH_BINARY + THRESH_OTSU);

    imshow("Original Image", img);
    imshow("BINARY", thresh1);
    imshow("OTSU", thresh2);
    waitKey(0);
    return 0;
}

代码:
https://gitee.com/BinaryAI/open-cv-c--and-python

参考:

[1]https://docs.opencv.org/4.6.0/

[2]https://zhuanlan.zhihu.com/p/384457101

[3]数字图像处理(MATLAB版)(第2版),张德丰, 人民邮电出版社

相关文章
|
5天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
42 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
5月前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
163 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
26天前
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
60 10
|
2月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
220 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
1月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
48 4
|
3月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
88 3
|
4月前
|
存储 JSON API
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
154 7
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
|
5月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
180 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
5月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
163 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
6月前
|
机器学习/深度学习 人工智能 TensorFlow
使用Python和TensorFlow实现图像识别
【8月更文挑战第31天】本文将引导你了解如何使用Python和TensorFlow库来实现图像识别。我们将从基本的Python编程开始,逐步深入到TensorFlow的高级功能,最后通过一个简单的代码示例来展示如何训练一个模型来识别图像。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息。
208 53