OpenCV——图像二值化
生活随笔
收集整理的這篇文章主要介紹了
OpenCV——图像二值化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV圖像二值化提供了兩種函數
threshold
double threshold( InputArray src, OutputArray dst,double thresh, double maxval, int type );- src:待二值化的圖像,圖像只能是CV_8U和CV_32F兩種數據類型。對于圖像通道數目的要求和選擇的二值化方法相關。
- dst:二值化后的圖像,與輸入圖像具有相同的尺寸、數據類型和通道數。
- thresh:二值化的閾值。
- maxval:二值化過程的最大值,此函數只在THRESH_BINARY和THRESH_BINARY_INV兩種二值化方法中才使用,但是在使用其他方法是也需要輸入。
- type:選擇圖像二值化方法的標志。
?二值化方法標志
除了最后兩個? 其他都比較好理解 就是作用的字面意思
最后兩種標志,這兩種標志是獲取閾值的方法,并不是閾值的比較方法的標志,這兩個標志可以和前面5種標志一起使用,例如“THRESH_BINARY| THRESH_OTSU”。前面5種標志在調用函數時都需要人為的設置閾值,如果對圖像不了解設置的閾值不合理,會對處理后的效果造成嚴重的影響,這兩個標志分別表示利用**大津法(OTSU)和三角形法(TRIANGLE)**結合圖像灰度值分布特性獲取二值化的閾值,并將閾值以函數返回值的形式給出。因此如果函數最后一個參數設置了這兩個標志中的任何一個,那么函數第三個參數thresh將由系統自動給出,但是在調用函數的時候仍然不能缺省,只是程序不會使用這個數值。需要注意的是,目前為止OpenCV 4中針對這兩個標志只支持輸入CV_8UC1類型的圖像。
threshold()函數全局只使用一個閾值,在實際情況中由于光照不均勻以及陰影的存在,全局只有一個閾值會使得在陰影處的白色區域也會被函數二值化成黑色,因此adaptiveThreshold()函數提供了兩種局部自適應閾值的二值化方法
adaptiveThreshold
void adaptiveThreshold( InputArray src, OutputArray dst,double maxValue, int adaptiveMethod,int thresholdType, int blockSize, double C );- src:待二值化的圖像,圖像只能是CV_8UC1數據類型。
- dst:二值化后的圖像,與輸入圖像具有相同的尺寸、數據類型。
- maxValue:二值化的最大值。
- adaptiveMethod:自制應確定閾值的方法,分為均值法ADAPTIVE_THRESH_MEAN_C和高斯法ADAPTIVE_THRESH_GAUSSIAN_C這兩種。
- thresholdType:選擇圖像二值化方法的標志,只能是THRESH_BINARY和THRESH_BINARY_INV。
- blockSize:自適應確定閾值的像素鄰域大小,一般為3,5,7的奇數。
- C:從平均值或者加權平均值中減去的常數,可以為正,也可以為負。
該函數將灰度圖像轉換成二值圖像,通過均值法和高斯法自適應的計算blockSize* blockSize鄰域內的閾值,之后進行二值化。
示例代碼:
// // Created by smallflyfly on 2021/6/9. //#include "opencv2/opencv.hpp" #include "opencv2/highgui.hpp"#include <iostream>using namespace cv; using namespace std;int main() {cout << "OpenCV Version: " << CV_VERSION << endl;Mat im = imread("test.jpg");cv::resize(im, im, Size(0, 0), 0.5, 0.5);Mat gray;cv::cvtColor(im, gray, CV_BGR2GRAY);Mat im1;cv::threshold(im, im1, 125, 255, cv::THRESH_BINARY);imshow("im1", im1);Mat im2;cv::threshold(im, im2, 125, 255, cv::THRESH_BINARY_INV);imshow("im2", im2);Mat gray1;cv::threshold(gray, gray1, 125, 255, cv::THRESH_TOZERO);imshow("gray1", gray1);Mat gray2;cv::threshold(gray, gray2, 125, 255, cv::THRESH_BINARY);imshow("gray2", gray2);Mat gray3;cv::threshold(gray, gray3, 125, 255, cv::THRESH_TRUNC);imshow("gray3", gray3);Mat gray4;cv::threshold(gray, gray4, 125, 255, cv::THRESH_BINARY|cv::THRESH_OTSU);imshow("gray4", gray4);Mat gray5;cv::threshold(gray, gray5, 100, 255, cv::THRESH_BINARY|cv::THRESH_TRIANGLE);imshow("gray5", gray5);// 自適應二值化Mat adMean, adGauss;adaptiveThreshold(gray, adMean, 255, cv::ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 25, 0);imshow("adMean", adMean);adaptiveThreshold(gray, adGauss, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 75, 0);imshow("adGauss", adGauss);waitKey(0);destroyAllWindows();return 0;}?
總結
以上是生活随笔為你收集整理的OpenCV——图像二值化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IIS 配置详解 请求长度限制调整
- 下一篇: 2048核心算法