OpenCV中阈值操作
生活随笔
收集整理的這篇文章主要介紹了
OpenCV中阈值操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? ? 閾值分割,顧名思義,就是對圖像的像素點和選中的閾值進行比對的圖像分割方法,在OpenCV 2.X中,Threshold()函數(基本閾值操作)和adaptiveThreshold()函數(自適應閾值操作)可以完成圖像閾值分割的目的?;舅枷胧?#xff1a;給定一個數組和一個閾值,根據數組中的每個元素值是高于還是低于閾值而進行一些處理。
1.固定閾值操作:Threshold()函數
? ? ? ?Threshold()函數對單通道數組應用固定閾值操作,該函數的典型應用是對灰度圖像進行閾值操作得到二值圖像,(compare()函數也可以達到此目的)或者是去掉噪聲,例如過濾很小或者很大像素值的圖像點? C++:double threshold(InputArray src,OutputArray dst,double thresh,double maxval,int type) ? ? ? ? ? ? 參數一:輸入數組,單通道,8或者32位浮點類型的Mat即可 ? ? ? ? ? ? 參數二:和第一個參數中的Mat變量有一樣的尺寸和類型。 ? ? ? ? ? ? 參數三:閾值的具體值 ? ? ? ? ? ? 參數四:double 類型的maxval,當第五個參數閾值類型type取CV_THRESHOLD_BINARY或者 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??CV_THRESHOLD_BINARY_INV時閾值類型時的最大值 。 ? ? ? ? ? ? 參數五:閾值類型,threshold()函數支持的對圖像取閾值的方法由下面確定: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? 上述標識符一次取值為0,1,2,3,4. 示例如下:// threshold.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream>using namespace std; using namespace cv;#define WINDOW_NAME "[程序窗口]" //為窗口標題定義的宏int g_nThresholdValue = 100; int g_nThresholdType = 3; Mat srcImage,grayImage,dstImage;//全局函數聲明 void on_Threshold(int,void*);//回調函數int _tmain(int argc, _TCHAR* argv[]) {srcImage = imread("1.jpg");if(!srcImage.data){printf("圖片讀取失敗!\n");return false;}imshow("[源圖像]",srcImage);//保留一份原圖的灰度圖cvtColor(srcImage,grayImage,COLOR_RGB2GRAY);//創建窗口并顯示原始圖namedWindow(WINDOW_NAME,WINDOW_AUTOSIZE);//創建滑動條來控制閾值createTrackbar("模式",WINDOW_NAME,&g_nThresholdType,4,on_Threshold);createTrackbar("參數值",WINDOW_NAME,&g_nThresholdValue,255,on_Threshold);//初始化自定義的閾值回調函數on_Threshold(0,0);waitKey();return 0; }void on_Threshold(int,void*) {//調用閾值函數threshold(grayImage,dstImage,g_nThresholdValue,255,g_nThresholdType);//更新效果圖imshow(WINDOW_NAME,dstImage); } 效果圖:
?2.自適應閾值操作:adaptiveThreshold()函數 ? ? ? ? ? ? adaptiveThreshold()函數的作用是對矩陣采用自適應閾值操作,支持就地操作
C++:void adaptiveThreshold(InputArray src,OutputArray dst,double maxValue,int adaptiveMethod,int thresholdType,int blockSize,double C) ? ? ? ? ?? ? ? ? ? ?參數一:源圖像,Mat類對象即可,需要是8位單通道浮點型圖像 ? ? ? ? ?參數二:需要和源圖像有一樣的尺寸和類型 ? ? ? ? ?參數三:給像素賦的滿足條件的非零值 ? ? ? ? ?參數四:用于指定要使用的自適應閾值算法,取值為:ADAPTIVE_THRESH_MEAN_C或者 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ADAPTIVE_THRESH_GAUSSIAN_C ? ? ? ? ?參數五:閾值類型,取值為THRESH_BINARY,THRESH_BINARY_INV其中之一 ? ? ? ? ?參數六:用于計算閾值大小的一個像素的鄰域尺寸,取值為3,5,7.等 ? ? ? ? ?參數七:減去平均或者加權平均后的常數值,通常為正數,但少數情況下也可以為0或者負數。
adaptiveThreshold()函數根據如下公式,將一副圖像變換為一副二值圖像。 ? 當參數五的"閾值類型"thresholdType"取值為THRESH_BINARY時,公式如下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?當參數五的"閾值類型"thresholdType"取值為THRESH_BINARY_INV時,公式如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
而其中的T(x,y) 為分別計算每個單獨像素值的閾值,取值如下:
- 對于 ADAPTIVE_THRESH_MEAN_C 的方法,閾值T(x,y) 為blockSize * blockSize 鄰域內(x,y) 減去第七個參數 C 的平均值
- 對于 ADAPTIVE_THRESH_GAUSSIAN_C 的方法,閾值T(x,y) 為blockSize * blockSize 鄰域內(x,y) 減去第七個參數 C 與高斯窗交叉相關的加權總和。
總結
以上是生活随笔為你收集整理的OpenCV中阈值操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV3.0中的图像金字塔与图片尺
- 下一篇: OpenGL中的轨迹球问题