日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

OpenCV中阈值操作

發布時間:2025/3/20 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV中阈值操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ? 閾值分割,顧名思義,就是對圖像的像素點和選中的閾值進行比對的圖像分割方法,在OpenCV 2.X中,Threshold()函數(基本閾值操作)和adaptiveThreshold()函數(自適應閾值操作)可以完成圖像閾值分割的目的。基本思想是:給定一個數組和一個閾值,根據數組中的每個元素值是高于還是低于閾值而進行一些處理。


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 與高斯窗交叉相關的加權總和。

#include "stdafx.h" #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream>using namespace std; using namespace cv; int main(int argc, char** argv) {Mat image = imread("1.jpg");Mat grayImage;cvtColor(image,grayImage,COLOR_RGB2GRAY);if (image.empty()){cout << "read image failure" << endl;return -1;}// 局部二值化int blockSize = 7;int constValue = 11;Mat local;adaptiveThreshold(grayImage, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);imshow("[源圖像]", image);imshow("localThreshold", local);waitKey(0);return 0; }

總結

以上是生活随笔為你收集整理的OpenCV中阈值操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。