二值化基本阈值操作
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
本章节给大家讲讲如何对图像进行二值化阈值操作。当前代码主体还是使用毛星云的demo,C#和Python都是在C++版本的基础上转换过来的,三个版本的效果基本一致。
C#版本代码
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
using System;
namespace demo
{
internal class Program
{
static string WINDOW_NAME = "【程序窗口】"; //为窗口标题定义的宏
static int g_nThresholdValue = 100;
static int g_nThresholdType = 3;
static Mat g_srcImage = new Mat();
static Mat g_grayImage = new Mat();
static Mat g_dstImage = new Mat();
static void on_Threshold(int pos, IntPtr userData)
{
//调用阈值函数
Cv2.Threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, (ThresholdTypes)g_nThresholdType);
//更新效果图
Cv2.ImShow(WINDOW_NAME, g_dstImage);
}
static void ShowHelpText()
{
Console.WriteLine($"\n\n\t\t\t 当前使用的OpenCV版本为:{Cv2.GetVersionString()}");
Console.WriteLine("\n\n ----------------------------------------------------------------------------\n");
//输出一些帮助信息
Console.WriteLine("\n\t欢迎来到【基本阈值操作】示例程序~\n\n");
Console.WriteLine("\n\t按键操作说明: \n\n");
Console.WriteLine("\t\t键盘按键【ESC】- 退出程序\n");
Console.WriteLine("\t\t滚动条模式0- 二进制阈值\n");
Console.WriteLine("\t\t滚动条模式1- 反二进制阈值\n");
Console.WriteLine("\t\t滚动条模式2- 截断阈值\n");
Console.WriteLine("\t\t滚动条模式3- 反阈值化为0\n");
Console.WriteLine("\t\t滚动条模式4- 阈值化为0\n");
}
static void Main(string[] args)
{
//【0】显示欢迎和帮助文字
ShowHelpText();
//【1】读入源图片
g_srcImage = Cv2.ImRead("../../../images/lake.jpg");
if (g_srcImage.Data == null)
{
Console.WriteLine("Oh,no,读取g_srcImage图片错误~!");
Console.Read();
return;
}
Cv2.ImShow("原始图", g_srcImage);
//【2】存留一份原图的灰度图
Cv2.CvtColor(g_srcImage, g_grayImage, ColorConversionCodes.BGR2GRAY);
//【3】创建窗口并显示原始图
Cv2.NamedWindow(WINDOW_NAME, WindowFlags.AutoSize);
//【4】创建滑动条来控制阈值
Cv2.CreateTrackbar("模式", WINDOW_NAME, ref g_nThresholdType, 4, on_Threshold);
Cv2.CreateTrackbar("参数值", WINDOW_NAME, ref g_nThresholdValue, 255, on_Threshold);
//【5】初始化自定义的阈值回调函数
on_Threshold(0, new IntPtr());
// 【6】轮询等待用户按键,如果ESC键按下则退出程序
while (true)
{
if ((char)Cv2.WaitKey(20) == 27)
{
break;
}
}
}
}
}
C++版本代码
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME "【程序窗口】" //为窗口标题定义的宏
int g_nThresholdValue = 100;
int g_nThresholdType = 3;
Mat g_srcImage, g_grayImage, g_dstImage;
static void ShowHelpText();//输出帮助文字
void on_Threshold(int, void*);//回调函数
int main()
{
//【0】改变console字体颜色
system("color 1F");
//【0】显示欢迎和帮助文字
ShowHelpText();
//【1】读入源图片
g_srcImage = imread("../images/lake.jpg");
if (!g_srcImage.data) {
printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n");
return false;
}
imshow("原始图", g_srcImage);
//【2】存留一份原图的灰度图
// opencv3:CV_RGB2GRAY
// opencv4:COLOR_RGB2GRAY
cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);
//【3】创建窗口并显示原始图
// opencv3:CV_WINDOW_AUTOSIZE
// opencv4:WINDOW_AUTOSIZE
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
//【4】创建滑动条来控制阈值
createTrackbar("模式", WINDOW_NAME, &g_nThresholdType, 4, on_Threshold);
createTrackbar("参数值", WINDOW_NAME, &g_nThresholdValue, 255, on_Threshold);
//【5】初始化自定义的阈值回调函数
on_Threshold(0, 0);
// 【6】轮询等待用户按键,如果ESC键按下则退出程序
while (1)
{
if ((char)waitKey(20) == 27)
{
break;
}
}
}
void on_Threshold(int, void*)
{
//调用阈值函数
threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, g_nThresholdType);
//更新效果图
imshow(WINDOW_NAME, g_dstImage);
}
static void ShowHelpText()
{
printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION);
printf("\n\n ----------------------------------------------------------------------------\n");
//输出一些帮助信息
printf("\n\t欢迎来到【基本阈值操作】示例程序~\n\n");
printf("\n\t按键操作说明: \n\n"
"\t\t键盘按键【ESC】- 退出程序\n"
"\t\t滚动条模式0- 二进制阈值\n"
"\t\t滚动条模式1- 反二进制阈值\n"
"\t\t滚动条模式2- 截断阈值\n"
"\t\t滚动条模式3- 反阈值化为0\n"
"\t\t滚动条模式4- 阈值化为0\n");
}
Python版本代码
import cv2
g_nThresholdValue = 100
g_nThresholdType = 3
g_srcImage = cv2.imread("../images/lake.jpg")
g_srcImage = cv2.cvtColor(g_srcImage, cv2.COLOR_BGR2GRAY)
# 模式
def on_Threshold1(x):
global g_srcImage, g_nThresholdValue, g_nThresholdType
g_nThresholdType = x
ret, g_maskImage = cv2.threshold(g_srcImage, g_nThresholdValue, 255, g_nThresholdType)
cv2.imshow('image', g_maskImage)
# 修改亮度
def on_Threshold2(x):
global g_srcImage, g_nThresholdValue, g_nThresholdType
g_nThresholdValue = x
ret, g_maskImage = cv2.threshold(g_srcImage, g_nThresholdValue, 255, g_nThresholdType)
cv2.imshow('image', g_maskImage)
# 创建窗口
cv2.namedWindow('image')
cv2.createTrackbar('model', 'image', 0, 4, on_Threshold1)
cv2.createTrackbar('number', 'image', 0, 255, on_Threshold2)
cv2.setTrackbarPos('model', 'image', 3)
cv2.setTrackbarPos('number', 'image', 100)
cv2.waitKey(0)
cv2.destroyAllWindows()