opencv--使用直方圖找谷底進行確定分割閾值

直方圖原理就不說了,大家自行百度

直方圖可以幫助分析圖像中的灰度變化,進而幫助確定最優二值化的灰度閾值(threshold level)。如果物體與背景的灰度值對比明顯,此時灰度直方圖就會包含雙峰(bimodal histogram),即直方圖中一般會有兩個峰值,分別為圖像的前景和背景。

前景使得某個灰度區間的灰度值的數量急劇增加,就會產生一個峰值,同理背景會使另一個灰度區間的灰度值的數量急劇增加,就產生另外一個峰值,兩峰間的谷底對應于物體邊緣附近相對較少數目的像素點。

這兩個峰值之間的最小值一般就是最優二值化的分界點,通過這個分界點可以把前景和背景很好地分割開來。

有時這兩個峰值會有部分重疊,即左側峰值的下降部分和右側峰值的上升部分存在疊加。通常可以把自然界的信號看做高斯信號,即一個峰值對應一個高斯信號,當直方圖中的兩個高斯信號在某個灰度區域疊加的時候,其疊加區就形成了一個圓滑的谷底,就很難找到一個確切的位置(最優二值化的灰度值)把這兩個峰值分開。

?

float calculateThreshold(cv::Mat& img)
{cv::Mat temp = img.clone();// 計算直方圖cv::Mat hist;int histSize = 256;  // 直方圖尺寸float range[] = { 0, 256 };  // 像素值范圍const float* ranges[] = { range };cv::calcHist(&img, 1, nullptr, cv::Mat(), hist, 1, &histSize, ranges);/*for (int i = 0; i < 21; i++)hist.at<float>(i, 0) = 0.0;*/cv::normalize(hist, hist, 0, 1, cv::NORM_MINMAX);//hist.convertTo(hist, CV_32S);cv::GaussianBlur(hist, hist, cv::Size(0, 0),3,3);//cv::blur(hist, hist, cv::Size(1, 9),cv::Point(-1,-1));std::vector<float> peaks;  // 存儲峰值位置std::vector<float> valleys;  // 存儲低谷位置for (int i = 1; i < histSize - 1; i++) {//std::cout << std::fixed << std::setprecision(4);float currentValue = hist.at<float>(i);float prevValue = hist.at<float>(i - 1);float nextValue = hist.at<float>(i + 1);/*if (currentValue < 0.001)continue;*/// 具體情況需要修改currentValue>0.005的閾值if ((currentValue > prevValue && currentValue > nextValue && currentValue>0.005)) {std::cout << prevValue << " " << currentValue << " " << nextValue << std::endl;peaks.push_back(i);  // 峰值}else if (currentValue < prevValue && currentValue < nextValue && currentValue>0.001) {std::cout << prevValue << " " << currentValue << " " << nextValue << std::endl;valleys.push_back(i);  // 低谷}}if(valleys.size()>0)cv::threshold(temp, temp, valleys[0], 255, cv::THRESH_BINARY);// 創建直方圖可視化圖像int histWidth = 512;int histHeight = 400;cv::Mat histImage(histHeight, histWidth, CV_8UC3, cv::Scalar(0, 0, 0));cv::Mat hist_temp;// 歸一化直方圖數據cv::normalize(hist, hist_temp, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());// 繪制直方圖int binWidth = cvRound((double)histWidth / histSize);for (int i = 0; i < histSize; i++) {int binHeight = cvRound(hist_temp.at<float>(i));cv::line(histImage, cv::Point(i * binWidth, histHeight), cv::Point(i * binWidth, histHeight - binHeight), cv::Scalar(255, 255, 255));}if (valleys.size() > 0)return valleys[0];return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/710913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710913.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python web框架fastapi數據庫操作ORM(一)

文章目錄 Fastapi ORM操作1、創建模型2、創建數據庫連接配置文件3、啟動項目4、根據模型類創建數據庫表1. 初始化配置&#xff0c;只需要使用一次2. 初始化數據庫&#xff0c;一般情況下只用一次3. 更新模型并進行遷移4. 重新執行遷移&#xff0c;寫入數據庫5. 回到上一個版本6…

Oracle 11g升級19c 后部分查詢功能很慢

*Oracle 11g升級19c 后部分查詢功能很慢 今天生產突然有個查詢非常慢&#xff0c;日志顯示執行了50秒左右&#xff0c;但是從日志中拿出SQL在PLSQL執行&#xff0c;發現用時不到1秒&#xff0c;查看SQL,懷疑是下面幾種原因導致 1、使用函數不當 UNIT.UNIT_CODE LIKE CONCAT(‘…

狀態碼轉文字!!!(表格數字轉文字)

1、應用場景&#xff1a;在我們的數據庫表中經常會有status這個字段&#xff0c;這個字段經常表示此類商品的狀態&#xff0c;例如&#xff1a;0->刪除&#xff0c;1->上架&#xff0c;0->下架&#xff0c;等等。 2、我們返回給前端數據時&#xff0c;如果在頁面顯示0…

python 線程、進程區別與事例

線程&#xff1a;簡單來說&#xff0c;一個進程中包含多個線程&#xff0c;比如打開一個 QQ&#xff08;進程&#xff09;&#xff0c;然后你一邊聊 QQ&#xff08;一個線程&#xff09;&#xff0c;一邊用 QQ 傳送文件&#xff08;一個線程&#xff09;&#xff0c;等等。在一…

Linux中如何執行腳本

要執行一個保存在文件中的腳本&#xff0c;可以按照以下步驟進行&#xff1a; 1. 創建腳本文件&#xff1a; 首先&#xff0c;使用文本編輯器&#xff08;如 ?vi?、?nano?等&#xff09;創建一個新的腳本文件&#xff0c;并將需要執行的命令寫入到文件中。例如&#xff0…

【Unity】在Unity中導出WebGL并讀取Excel數據的實現方法

在游戲開發中&#xff0c;數據的處理和導出是至關重要的環節之一。Unity作為一款強大的游戲開發引擎&#xff0c;提供了豐富的工具和功能來處理和導出數據&#xff0c;包括將游戲導出為WebGL應用&#xff0c;并讀取外部數據文件&#xff0c;比如Excel表格。本文將介紹如何在Uni…

gpt生成器,批量gpt文章生成器

GPT&#xff08;生成式預訓練模型&#xff09;生成器軟件在當今的數字化時代扮演著越來越重要的角色&#xff0c;它們通過人工智能技術&#xff0c;可以自動生成各種類型的文章內容&#xff0c;為用戶提供了無限的創作可能性。本文將介紹6款不同的GPT生成器軟件&#xff0c;并介…

STM32自學?AD單通道

程序的最終運行成果: 當轉動電位器時&#xff0c;數值和電壓值發生變化 ad.c文件 #include "stm32f10x.h" #include "stm32f10x_adc.h" #include "ad.h" #include "stdint.h" void ad_Init(void) { /* 初始化步驟&#xff1a;…

java學習筆記-初級

一、變量 1.雙標簽 <!-- 外部js script 雙標簽 --><script srcmy.js></script> 在新文件my.js里面寫&#xff1a; 2.字符串定義&#xff1a; //外單內雙var str 我是一個"高富帥"的程序員;console.log(str);// 字符串轉義字符 都是用 \ 開頭 …

并發編程中常見的設計模式,c++多線程如何設計

C多線程設計&#xff08;任務的“多對一”、“一對多”、“多對多”情況 該如何設計線程&#xff1f;&#xff09; C書籍中并未找到對多線程設計&#xff0c;有很完整詳細的總結&#xff01;&#xff01;C并發編程書籍中也只是一些理論或則零散的多線程實例。無奈&#xff0c;…

MySQL-MHA搭建、故障測試

一、架構說明 MHA&#xff08;Master High Availability&#xff09;是一個用于 MySQL 主從復制管理和自動故障轉移的開源工具集。MHA 的主要目的是提供 MySQL 環境的高可用性和自動故障轉移功能&#xff0c;確保在主庫發生故障時能夠快速切換到備庫&#xff0c;降低業務中斷時…

ElasticSearch之Completion Suggester

寫在前面 通過completion suggester可以實現如下的效果&#xff1a; 其實就是做的like xxx%這種。通過FST這種數據結構來存儲&#xff0c;實現快速的前綴匹配&#xff0c;并且可以將es所有的數據加載到內存中所以速度completion的查詢速度非常快。 需要注意&#xff0c;如果…

JWT令牌的使用教程

一、導入maven依賴 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency> 二、導入JWT工具類 &#xff08;工具類&#xff09; import io.jsonwebtoken.Cl…

HUAT——Fasc——算法組學習筆記

目錄 系列文章目錄 前言 一、配置相關環境 二、創建工作空間 1.創建工作空間并初始化 2.進入 src 創建 ros 包并添加依賴 三、HelloWorld(C版) 1.進入 ros 包的 src 目錄編輯源文件 2.編輯 ros 包下的 Cmakelist.txt文件 3.進入工作空間目錄并編譯 四 運行程序 五 …

docker 基礎(二)

常見命令 Docker最常見的命令就是操作鏡像、容器的命令&#xff0c;詳見官方文檔&#xff1a;https://docs.docker.com/ 數據卷 命令說明文檔地址docker volume create創建數據卷docker volume createdocker volume ls創建數據卷docker volume lsdocker volume rm查看所有數…

asp.net core webapi接收application/x-www-form-urlencoded和form-data參數

框架&#xff1a;asp.net core webapiasp.net core webapi接收參數&#xff0c;請求變量設置 目錄 接收multipart/form-data、application/x-www-form-urlencoded類型參數接收URL參數接收上傳的文件webapi接收json參數 接收multipart/form-data、application/x-www-form-urlenc…

Swiper實現輪播效果

swiper官網&#xff1a;https://3.swiper.com.cn/ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

中間件-Nginx加固(控制超時時間限制客戶端下載速度并發連接數)

中間件-Nginx加固&#xff08;控制超時時間&限制客戶端下載速度&并發連接數&#xff09; 1.1 Nginx 控制超時時間配置1.2 Nginx 限制客戶端下載速度&并發連接數 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496; 1.1 Nginx 控制超…

TypeScript07:枚舉enum

一、擴展類型 擴展類型&#xff1a;類型別名、枚舉、接口、類。 枚舉&#xff1a;通常用于約束某個變量的取值范圍。 字面量和聯合類型配合使用&#xff0c;也可以達到同樣的目標。 二、字面量類型的問題 在類型約束位置&#xff0c;會產生重復代碼。可以使用類型別名解…

PSMC:繪圖腳本 psmc_plot.pl 腳本參數詳解

=> psmc_plot.plUsage: psmc_plot.pl [options] <out.prefix> <in.psmc>Options: -u FLOAT absolute mutation rate per nucleotide [2.5e-08]-s INT skip used in data preparation [100]-X FLOAT maximum generations,