OpenCV学习笔记(十一):阈值化:threshold(),adaptivethreshold()
生活随笔
收集整理的這篇文章主要介紹了
OpenCV学习笔记(十一):阈值化:threshold(),adaptivethreshold()
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
OpenCV學(xué)習(xí)筆記(十一):閾值化:threshold(),adaptivethreshold()
一、定義:
1)固定閾值操作
double threshold( InputArray src, // 輸入圖像,單通道 OutputArray dst, // 輸出圖像 double thresh, // 閾值的具體值 double maxval, // 最大值,生成二值圖時(shí)用到 int type); // 閾值類型// 常用的兩種閾值化類型// THRESH_BINARY = 0, 閾值化處理生成二值圖像// THRESH_BINARY_INV = 1, 閾值化處理并反轉(zhuǎn)生成二值圖 ==閾值類型:== 0 = THRESH_BINARY二進(jìn)制閾值化: 將灰度值大于thresh的設(shè)置為maxval,不大于thresh設(shè)置為0。1 = THRESH_BINARY_INV反二進(jìn)制閾值化: 將灰度值大于thresh的設(shè)置為0,不大于thresh設(shè)置為maxval。2 = THRESH_TRUNC截?cái)嚅撝祷?#xff1a; 將灰度值大于thresh的設(shè)置為threshold,不大于thresh的灰度值不變。3 = THRESH_TOZERO閾值化為0: 將灰度值大于thresh的不變,超過閾值置為0。4 = THRESH_TOZERO_INV反閾值化為0: 將灰度值大于thresh的不變,低于閾值置為0。THRESH_MASKTHRESH_OTSU 使用Otsu算法選擇最優(yōu)閾值,使這個閾值可以將前景色和背景色盡可能分開。 THRESH_TRIANGLE 使用三角形算法選擇最優(yōu)閾值2)自適應(yīng)閾值化操作
void adaptiveThreshold( InoutArray src, // 源圖像數(shù)組 OutputArray dst, // 輸出圖像組 double maxValue, // 最大值,生成二值圖時(shí)用到 int adaptiveMethod, // 自適應(yīng)閾值算法選擇 ADAPTIVE_THRESH_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C; int thresholdType, // 閾值類型THRESH_BINARY或THRESH_BINARY_INV int blockSize, // 鄰域塊大小,用來計(jì)算區(qū)域閾值,一般選擇3、5、7……; double C // 它是一個從均勻或加權(quán)均值提取的常數(shù),可以是負(fù)數(shù) )==自適應(yīng)閾值算法== ADAPTIVE_THRESH_MEAN_C 的計(jì)算方法是 計(jì)算出鄰域的平均值再減去第七個參數(shù)double C的值A(chǔ)DAPTIVE_THRESH_GAUSSIAN_C 的計(jì)算方法是 計(jì)算出鄰域的高斯均勻值再減去第七個參數(shù)double C的值二、固定閾值threshold() 代碼示例:
1)主函數(shù)
#include <opencv2/opencv.hpp>using namespace cv; using namespace std;int g_nThresholdValue1 = 124,g_nThresholdValue2=175; int g_nThresholdType = 0; // 閾值類型 標(biāo)識 Mat g_srcImage,g_grayImage,g_dstImage,g_dstImage1,g_dstImage2;int main() {// 顯示歡迎和幫助文字ShowHelpText( );// 1、讀入源圖片g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/pellets.png");if(!g_srcImage.data ) { printf("讀取圖片錯誤,請確定目錄下是否有imread函數(shù)指定的圖片存在~! \n"); return false; }imshow("原始圖",g_srcImage);// 2、存留一份原圖的灰度圖cvtColor( g_srcImage, g_grayImage, COLOR_RGB2GRAY );// 3、創(chuàng)建窗口并顯示原始圖namedWindow( "【程序窗口】", WINDOW_AUTOSIZE );// 4、創(chuàng)建滑動條來控制閾值createTrackbar( "模式", "【程序窗口】", &g_nThresholdType,4, on_Threshold );createTrackbar( "min閾值1","【程序窗口】", &g_nThresholdValue1,255, on_Threshold );createTrackbar( "max閾值2","【程序窗口】", &g_nThresholdValue2,255, on_Threshold );// 5、初始化自定義的閾值回調(diào)函數(shù)on_Threshold( 0, 0 );// 6、輪詢等待用戶按鍵,如果ESC鍵按下則退出程序while(1){int key;key = waitKey( 20 );if( (char)key == 27 ){ break; }}return 0; }2)獲取區(qū)間像素點(diǎn)總數(shù):
int getWhitePixel(Mat& img) {int area=0;for(int i=0 ; i<img.rows ; i++)for(int j=0 ; j<img.cols ; j++)if(img.at<uchar>(i,j)==255)area ++;return area;// int area=0; // int rowNumber = img.rows; //行數(shù) // int colNumber = img.cols*img.channels(); //列數(shù) x 通道數(shù)=每一行元素的個數(shù) // //雙重循環(huán),遍歷所有的像素值 // for (int i = 0; i < rowNumber; i++) //行循環(huán) // { // uchar *data = img.ptr<uchar>(i); //獲取第i行的首地址 // for (int j = 0; j < colNumber; j++) // if(data[j] ==255) // area ++; // } // return area; }3)區(qū)間閾值實(shí)現(xiàn)函數(shù):
void on_Threshold( int, void* ) {//調(diào)用閾值函數(shù)//CV_THRESH_BINARY = 0, /**< value = value > threshold ? max_value : 0 *///CV_THRESH_BINARY_INV = 1, /**< value = value > threshold ? 0 : max_value *///CV_THRESH_TRUNC = 2, /**< value = value > threshold ? threshold : value *///CV_THRESH_TOZERO = 3, /**< value = value > threshold ? value : 0 *///CV_THRESH_TOZERO_INV = 4, /**< value = value > threshold ? 0 : value */threshold(g_grayImage,g_dstImage1,g_nThresholdValue1,255,g_nThresholdType); // CV_THRESH_BINARYimshow( "threshold1", g_dstImage1 );threshold(g_grayImage,g_dstImage2,g_nThresholdValue2,255,g_nThresholdType);imshow( "threshold2", g_dstImage2 );// 兩圖相減 g_dstImage1-g_dstImage2=g_dstImageaddWeighted(g_dstImage1,1.0,g_dstImage2,-1,0,g_dstImage);// 顯示區(qū)間像素點(diǎn)數(shù)int area = getWhitePixel(g_dstImage);printf("\n 區(qū)間面積area =%d pixel",area);//更新效果圖imshow( "【程序窗口】", g_dstImage ); } static void ShowHelpText() {//輸出一些幫助信息printf( "\n\t歡迎來到【基本閾值操作】示例程序~\n\n");printf( "\n\t按鍵操作說明: \n\n""\t\t鍵盤按鍵【ESC】- 退出程序\n""\t\t滾動條模式0- 二進(jìn)制閾值\n""\t\t滾動條模式1- 反二進(jìn)制閾值\n""\t\t滾動條模式2- 截?cái)嚅撝礬n""\t\t滾動條模式3- 反閾值化為0\n""\t\t滾動條模式4- 閾值化為0\n" ); }結(jié)果:
在這里插入圖片描述
Halcon對比:
二、固定閾值threshold() 代碼示例:
1)主函數(shù)
#include <opencv2/opencv.hpp>using namespace cv; using namespace std;Mat g_srcImage, g_grayImage,g_matAdaptive; int g_nadaptiveMethod = ADAPTIVE_THRESH_MEAN_C; int g_C = 5; int g_blockSize=1;int main() {// 1、讀入源圖片g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/pellets.png");if(!g_srcImage.data ) { printf("讀取圖片錯誤,請確定目錄下是否有imread函數(shù)指定的圖片存在~! \n"); return false; }imshow("原始圖",g_srcImage);// 2、存留一份原圖的灰度圖cvtColor( g_srcImage, g_grayImage, COLOR_RGB2GRAY );// 3、創(chuàng)建窗口并顯示原始圖namedWindow( "【自適應(yīng)閾值分割】" , WINDOW_AUTOSIZE );// 4、創(chuàng)建滑動條來控制閾值createTrackbar( "閾值算法", "【自適應(yīng)閾值分割】" , &g_nadaptiveMethod,1, on_Threshold );createTrackbar( "領(lǐng)域尺寸","【自適應(yīng)閾值分割】" , &g_blockSize,9, on_Threshold );createTrackbar( "常數(shù) C","【自適應(yīng)閾值分割】" , &g_C,255, on_Threshold );// 5、初始化自定義的閾值回調(diào)函數(shù)on_Threshold( 0, 0 );// 6、輪詢等待用戶按鍵,如果ESC鍵按下則退出程序while(1){int key;key = waitKey( 20 );if( (char)key == 27 ){ break; }}return 0; } void on_Threshold( int, void* ) { // 自適應(yīng)閾值分割adaptiveThreshold(g_grayImage, g_matAdaptive, 255, g_nadaptiveMethod, THRESH_BINARY_INV, 2*g_blockSize+1, g_C);// 更新效果圖imshow( "【自適應(yīng)閾值分割】" , g_matAdaptive ); }結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的OpenCV学习笔记(十一):阈值化:threshold(),adaptivethreshold()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 登录python自动化_Appium+P
- 下一篇: LaTeX对公式字体加粗