OpenCV——图像二值化
OpenCV圖像二值化提供了兩種函數(shù)
threshold
double threshold( InputArray src, OutputArray dst,double thresh, double maxval, int type );- src:待二值化的圖像,圖像只能是CV_8U和CV_32F兩種數(shù)據(jù)類型。對于圖像通道數(shù)目的要求和選擇的二值化方法相關(guān)。
- dst:二值化后的圖像,與輸入圖像具有相同的尺寸、數(shù)據(jù)類型和通道數(shù)。
- thresh:二值化的閾值。
- maxval:二值化過程的最大值,此函數(shù)只在THRESH_BINARY和THRESH_BINARY_INV兩種二值化方法中才使用,但是在使用其他方法是也需要輸入。
- type:選擇圖像二值化方法的標志。
?二值化方法標志
除了最后兩個? 其他都比較好理解 就是作用的字面意思
最后兩種標志,這兩種標志是獲取閾值的方法,并不是閾值的比較方法的標志,這兩個標志可以和前面5種標志一起使用,例如“THRESH_BINARY| THRESH_OTSU”。前面5種標志在調(diào)用函數(shù)時都需要人為的設(shè)置閾值,如果對圖像不了解設(shè)置的閾值不合理,會對處理后的效果造成嚴重的影響,這兩個標志分別表示利用**大津法(OTSU)和三角形法(TRIANGLE)**結(jié)合圖像灰度值分布特性獲取二值化的閾值,并將閾值以函數(shù)返回值的形式給出。因此如果函數(shù)最后一個參數(shù)設(shè)置了這兩個標志中的任何一個,那么函數(shù)第三個參數(shù)thresh將由系統(tǒng)自動給出,但是在調(diào)用函數(shù)的時候仍然不能缺省,只是程序不會使用這個數(shù)值。需要注意的是,目前為止OpenCV 4中針對這兩個標志只支持輸入CV_8UC1類型的圖像。
threshold()函數(shù)全局只使用一個閾值,在實際情況中由于光照不均勻以及陰影的存在,全局只有一個閾值會使得在陰影處的白色區(qū)域也會被函數(shù)二值化成黑色,因此adaptiveThreshold()函數(shù)提供了兩種局部自適應(yīng)閾值的二值化方法
adaptiveThreshold
void adaptiveThreshold( InputArray src, OutputArray dst,double maxValue, int adaptiveMethod,int thresholdType, int blockSize, double C );- src:待二值化的圖像,圖像只能是CV_8UC1數(shù)據(jù)類型。
- dst:二值化后的圖像,與輸入圖像具有相同的尺寸、數(shù)據(jù)類型。
- maxValue:二值化的最大值。
- adaptiveMethod:自制應(yīng)確定閾值的方法,分為均值法ADAPTIVE_THRESH_MEAN_C和高斯法ADAPTIVE_THRESH_GAUSSIAN_C這兩種。
- thresholdType:選擇圖像二值化方法的標志,只能是THRESH_BINARY和THRESH_BINARY_INV。
- blockSize:自適應(yīng)確定閾值的像素鄰域大小,一般為3,5,7的奇數(shù)。
- C:從平均值或者加權(quán)平均值中減去的常數(shù),可以為正,也可以為負。
該函數(shù)將灰度圖像轉(zhuǎn)換成二值圖像,通過均值法和高斯法自適應(yīng)的計算blockSize* blockSize鄰域內(nèi)的閾值,之后進行二值化。
示例代碼:
// // 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);// 自適應(yīng)二值化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;}?
總結(jié)
以上是生活随笔為你收集整理的OpenCV——图像二值化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IIS 配置详解 请求长度限制调整
- 下一篇: python变量名长度有限制吗_url长