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