自適應閾值化操作:adaptiveThreshold()函數

在圖像閾值化操作中,更關注的是從二值化圖像中,分離目標區域和背景區域,但是僅僅通過設定固定閾值很難達到理想的分割效果。而自適應閾值,則是根據像素的鄰域塊的像素值分布來確定該像素位置上的二值化閾值。這樣做的好處:

1. 每個像素位置處的二值化閾值不是固定不變的,而是由其周圍鄰域像素的分布來決定的。

2. 亮度較高的圖像區域的二值化閾值通常會較高,而亮度低的圖像區域的二值化閾值則會相適應的變小。

3. 不同亮度、對比度、紋理的局部圖像區域將會擁有相對應的局部二值化閾值。

函數原型

1.    void adaptiveThreshold(InputArray src, OutputArray dst,  
2.                           double maxValue, int adaptiveMethod,  
3.                           int thresholdType, int bolckSize, double C)  

參數說明

參數1:InputArray類型的src,輸入圖像,填單通道,單8位浮點類型Mat即可。
參數2:函數運算后的結果存放在這。即為輸出圖像(與輸入圖像同樣的尺寸和類型)。
參數3:預設滿足條件的最大值。
參數4:指定自適應閾值算法。可選擇ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C兩種。(具體見下面的解釋)。
參數5:指定閾值類型。可選擇THRESH_BINARY或者THRESH_BINARY_INV兩種。(即二進制閾值或反二進制閾值)。
參數6:表示鄰域塊大小,用來計算區域閾值,一般選擇為3、5、7......等。
參數7:參數C表示與算法有關的參數,它是一個從均值或加權均值提取的常數,可以是負數。(具體見下面的解釋)。
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

對參數4與參數7內容的解釋:
自適應閾值化計算大概過程是為每一個象素點單獨計算的閾值,即每個像素點的閾值都是不同的,就是將該像素點周圍B*B區域內的像素加權平均,然后減去一個常數C,從而得到該點的閾值。B由參數6指定,常數C由參數7指定。

ADAPTIVE_THRESH_MEAN_C,為局部鄰域塊的平均值,該算法是先求出塊中的均值,再減去常熟C。

ADAPTIVE_THRESH_GAUSSIAN_C,為局部鄰域塊的高斯加權和。該算法是在區域中(x, y)周圍的像素根據高斯函數按照他們離中心點的距離進行加權計算,再減去常數C。

舉個例子:如果使用平均值方法,平均值mean為190,差值delta(即常數C)為30。那么灰度小于160的像素為0,大于等于160的像素為255。如下圖:

如果是反向二值化,如下圖:

delta(常數C)選擇負值也是可以的。

代碼演示

/*自適應閾值:adaptiveThreshold()函數
*/#include <opencv2/core/core.hpp>              
#include <opencv2/highgui/highgui.hpp>              
#include <opencv2/imgproc/imgproc.hpp>             
#include <iostream>            
using namespace std;
using namespace cv;int main()
{//------------【1】讀取源圖像并檢查圖像是否讀取成功------------    Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\build.jpg");if (!srcImage.data){cout << "讀取圖片錯誤,請重新輸入正確路徑!\n";system("pause");return -1;}imshow("【源圖像】", srcImage);//------------【2】灰度轉換------------    
    Mat srcGray;cvtColor(srcImage, srcGray, CV_RGB2GRAY);imshow("【灰度圖】", srcGray);//------------【3】初始化相關變量---------------  Mat dstImage;        //初始化自適應閾值參數const int maxVal = 255;int blockSize = 3;    //取值3、5、7....等int constValue = 10;int adaptiveMethod = 0;int thresholdType = 1;/*自適應閾值算法0:ADAPTIVE_THRESH_MEAN_C1:ADAPTIVE_THRESH_GAUSSIAN_C--------------------------------------閾值類型0:THRESH_BINARY1:THRESH_BINARY_INV*///---------------【4】圖像自適應閾值操作-------------------------
    adaptiveThreshold(srcGray, dstImage, maxVal, adaptiveMethod, thresholdType, blockSize, constValue);imshow("【自適應閾值】", dstImage);waitKey(0);return 0;
}

顯示結果

可以發現自適應閾值能很好的觀測到邊緣信息。閾值的選取是算法自動完成的,很方便。

濾波處理?

另外,做不做濾波處理等對圖像分割影響也比較大。

1. adaptiveThreshold分割

    Mat img=imread("D:/ImageTest/sudoku.png",CV_LOAD_IMAGE_COLOR);Mat dst1;Mat dst2;Mat dst3;cv::cvtColor(img,img,COLOR_RGB2GRAY);//進行,灰度處理medianBlur(img,img,5);//中值濾波threshold(img,dst1, 127, 255, THRESH_BINARY);//閾值分割adaptiveThreshold(img,dst2,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,11,2);//自動閾值分割,鄰域均值adaptiveThreshold(img,dst3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,11,2);//自動閾值分割,高斯鄰域//ADAPTIVE_THRESH_MEAN_C : threshold value is the mean of neighbourhood area//ADAPTIVE_THRESH_GAUSSIAN_C : threshold value is the weighted sum of neighbourhood values where weights are a gaussian window. imshow("dst1", dst1);imshow("dst2", dst2);imshow("dst3", dst3);imshow("img", img);waitKey(0);

效果對比,很明顯加入鄰域權重后處理更理想:

2. 加入濾波處理的最大類間方差分割

Mat img=imread("D:/ImageTest/pic2.png",CV_LOAD_IMAGE_COLOR);Mat dst1;Mat dst2;Mat dst3;cv::cvtColor(img,img,COLOR_RGB2GRAY);//進行,灰度處理//    medianBlur(img,img,5);threshold(img,dst1, 127, 255, THRESH_BINARY);threshold(img,dst2,0, 255, THRESH_OTSU);//最大類間方差法分割 Otsu algorithm to choose the optimal threshold valueMat img2=img.clone();GaussianBlur(img2,img2,Size(5,5),0);//高斯濾波去除小噪點threshold(img2,dst3, 0, 255, THRESH_OTSU);imshow("BINARY dst1", dst1);imshow("OTSU dst2", dst2);imshow("GaussianBlur OTSU dst3", dst3);imshow("original img", img);waitKey(0);

效果如下,顯然不濾波和濾波差別明顯:

?

?

?

?

參考文章:https://blog.csdn.net/sinat_36264666/article/details/77586964

? ? ? ? ? ? ?https://blog.csdn.net/abcvincent/article/details/78822191

轉載于:https://www.cnblogs.com/GaloisY/p/11037350.html

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

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

相關文章

阿里P8親自教你!Activity的6大難點,你會幾個?年薪50W

前言 網上有很多對程序員簡歷的一些指導&#xff0c;這里就不重述&#xff0c;大家可以搜下網上其他大神的總結&#xff0c;結合自身情況修改下。我有幾點建議&#xff1a; 1.盡量不要花哨&#xff0c;程序員和設計師或者產品運營還不一樣&#xff0c;我們的簡歷成功與否決定…

為什么選用NACOS

Nacos Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集&#xff0c;幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。 Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構 (例如…

Qt樣式表之一:Qt樣式表和盒子模型介紹

一、Qt樣式表介紹 Qt樣式表是一個可以自定義部件外觀的十分強大的機制&#xff0c;可以用來美化部件。Qt樣式表的概念、術語和語法都受到了HTML的層疊樣式表&#xff08;Cascading Style Sheets, CSS)的啟發&#xff0c;不過與CSS不同的是&#xff0c;Qt樣式表應用于部件的世界…

阿里P8大佬親自教你!Android內存泄漏總結,看看這篇文章吧!

前言 這次去騰訊面試的是我大學同學&#xff0c;我們大學都是一學習&#xff0c;一起吃飯&#xff0c;一起洗腳&#xff0c;一起。。。 他們公司最近也裁員了&#xff0c;不過他是裁員前去的騰訊&#xff0c;不知道誰撈到他簡歷了&#xff0c;莫名就走了流程&#xff0c;他莫…

Sentinel在訂單大量服務調用的應用場景

Sentinel譯為“哨兵”&#xff0c;顧名思義&#xff0c;面對您后臺的大量服務/微服務&#xff0c;前置一個哨兵&#xff0c;但面對大量請求時&#xff0c;讓后臺服務有序被調用&#xff0c;但某些服務的不可用時&#xff0c;采用服務熔斷降級等措施&#xff0c;讓系統仍能平穩運…

leetcode 214 Shortest Palindrome

lc214 Shortest Palindrome 可以將問題轉化成找到原字符串的最長palindrome子串&#xff08;注意&#xff0c;子串必須以s[0]為起始&#xff09; 例如&#xff1a;sdserf sds為最長palindrome子串 只需要將sds之后的子串翻轉一下&#xff0c;補充到原字符串之前即可 fre sdser…

程序員深度學習!我想談談關于Android面試那些事,附贈課程+題庫

想要成為一名優秀的Android開發&#xff0c;你需要一份完備的知識體系&#xff0c;在這里&#xff0c;讓我們一起成長為自己所想的那樣~。 25%的面試官會在頭5分鐘內決定面試的結果60%的面試官會在頭15分鐘內決定面試的結果 一般來說&#xff0c;一場單面的時間在30分鐘左右&…

MOSS 代替Spring Boot Admin 的服務治理工具

1.1 什么是服務治理 服務治理&#xff0c;我也稱之為微服務治理&#xff0c;是指用來管理微服務的整個生命周期。包括應用的創建&#xff0c;服務名的規范&#xff0c;服務的上下線&#xff0c;服務的遷移&#xff0c;整個服務的生老病死等方方面面的治理。 1.2 Moss概述 Mo…

Django之form表單組件、cookie與session

---恢復內容開始--- Form表單組件 引例&#xff1a; 先來看一個注冊的例子&#xff0c;全部用的是reg函數來實現的。 views.py文件 def reg(request):errors {username:,password:}if request.method POST:username request.POST.get(username)password request.POST.get(p…

程序員經驗分享:Android高級工程師系列學習路線介紹,面試必備

前言 曾聽過很多人說Android學習很簡單&#xff0c;做個App就上手了&#xff0c;工作機會多&#xff0c;畢業后也比較容易找工作。這種觀點可能是很多Android開發者最開始入行的原因之一。 在工作初期&#xff0c;工作主要是按照業務需求實現App頁面的功能&#xff0c;按照設…

Java實現將文件或者文件夾壓縮成zip

Java實現將文件或者文件夾壓縮成zip 最近碰到個需要下載zip壓縮包的需求&#xff0c;于是我在網上找了下別人寫好的zip工具類。但找了好多篇博客&#xff0c;總是發現有bug。因此就自己來寫了個工具類。 這個工具類的功能為&#xff1a; &#xff08;1&#xff09;可以壓縮文件…

算法題+JVM+自定義View,隔壁都饞哭了

反思 昨晚去北京大望路阿里面試, 產生了嚴重的挫敗感, 羞愧難當. 比不得從大學就有目標有理想, 一直在為目標努力學習技術的同學, 在大學唯一能拿得出手的就是參加了電子設計大賽, 學了點嵌入式的知識. 畢業后開始做android, 說得好聽點叫做項目, 實際上就是搬代碼, 真正記到…

n2n內網穿透打洞部署全過程 + nginx公網端口映射

內網穿透、打洞工具有很多&#xff0c;此前在windows上使用的是vidcc這個玩意&#xff0c;也正因為linux不支持。自此在linux嘗試過一些打洞工具&#xff0c;ssh 反向代理這些&#xff0c;因為安全性不便捷等多種原因&#xff0c;最終選擇了n2n。 由于初次接觸n2n&#xff0c;對…

Windows下快速刪除上萬個文件和子目錄

為什么會慢 如果直接在Windows文件管理器里刪除的話&#xff08;通過菜單或者鍵盤Del或者ShiftDel&#xff09;&#xff0c;刪除這個數量的文件需要大概10幾分鐘&#xff0c;具體根據文件數量目錄層次不同耗時不同。這么慢是因為在刪除之前系統有個準備階段&#xff0c;在這個階…

終于有人把安卓程序員必學知識點全整理出來了,BAT大廠面試總結

行業激烈變化時&#xff0c;恰恰是機會最多的時候 坦白講&#xff0c;許多人骨子里害怕變化和競爭。 其實大可不必。 一來&#xff0c;怕也沒用嘛。二來&#xff0c;變化越快&#xff0c;組合要素增加了&#xff0c;意味著新的工作機會越多。 就像傳統媒體VS新媒體。 放在…

c#反混淆工具de4dot 一般混淆都可以解決

c#反混淆工具de4dot 一般混淆都可以解決 使用方法&#xff1a; 1、CMD 打開 De4Dot 所在文件夾 最好是以管理員身份運行CMD 2、輸入 De4Dot C:\Users\muzigaiyu\Desktop\demo.exe 回車 成功后會在軟件所在文件夾生成 demo-cleaned.exe 在用dotpeek 或者其他軟件打開exe即可看…

餐廳點餐系統:測試與部署

項目測試與部署 1.系統測試 項目調試完成后&#xff0c;將項目打包成war包放入tomcat/wabapps文件夾&#xff0c;本機啟動tomcat&#xff0c;redis緩存&#xff0c;mysql數據庫等服務&#xff0c;本機訪問localhost&#xff1a;8080/BookFood&#xff0c;測試系統的各個功能是否…

SpringCloud與Seata分布式事務初體驗

在本篇文章中我們在SpringCloud環境下通過使用Seata來模擬用戶購買商品時由于用戶余額不足導致本次訂單提交失敗&#xff0c;來驗證下在MySQL數據庫內事務是否會回滾。 本章文章只涉及所需要測試的服務列表以及Seata配置部分。 用戶提交訂單購買商品大致分為以下幾個步驟&…

想學IT的必看!今年Android面試必問的這些技術面,架構師必備技能

第一次觀看我文章的朋友&#xff0c;可以關注、點贊、轉發一下&#xff0c;每天分享各種干貨技術和程序猿趣事 前言 職場的金三銀四跳槽季又來了&#xff0c;不同的是今年比往年「冷」一些&#xff0c;形式更加嚴峻一些&#xff0c;大家多多少少可能都聽到或看到一些信息&…

springboot集成redis使用redis作為session報錯ClassNotFoundException類RememberMeServices

springboot 集成redis使用redis作為緩存&#xff0c;會報錯的問題。 錯誤信息&#xff1a; java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration.taskSchedulerat org.springframew…