day26 學習筆記

文章目錄

  • 前言
  • 一、圖像顏色轉換
    • 1.HSV顏色空間
    • 2.顏色轉換
  • 二、灰度化
    • 1.最大值法
    • 2.平均值法
    • 3.加權均值法
  • 三、二值化
    • 1.全局閾值法
      • 1.閾值法(THRESH_BINARY)
      • 2.反閾值法(THRESH_BINARY_INV)
      • 3.截斷閾值法(THRESH_TRUNC)
      • 4.低閾值零處理(THRESH_TOZERO)
      • 5.超閾值零處理(THRESH_TOZERO_INV)
      • 6.OTSU算法
      • 7.代碼展示
    • 2.局部閾值法


前言

  • 通過今天的學習,我掌握了OpenCV中有關圖像顏色轉換,灰度化,二值化的基本原理和操作方式

一、圖像顏色轉換

  • 我們常見的單張圖像,不僅可以用 RGB 顏色空間來描述其色彩信息 ,還可以用 HSV 顏色空間來表示

1.HSV顏色空間

  • RGB顏色模型使用紅、綠、藍三原色的強度來表示顏色,是一種加色法模型,即顏色的混合是添加三原色的強度。而HSV顏色空間使用色調(Hue)、飽和度(Saturation)和亮度(Value)三個參數來表示顏色
  • HSV顏色空間更加符合人類對顏色的感知方式
  • 顏色調整更加直觀,只需要調整色調和飽和度即可完成對圖像顏色的調整
  • 在圖像處理中分割某種顏色物體時,只需在HSV空間中限定H的范圍,而無需同時處理R、G、B三個通道的復雜組合,使用更加簡便

2.顏色轉換

  • 我們可以將使用RGB顏色模型表示的圖像轉換為灰度圖或者使用HSV顏色空間表示
  • cv.cvtColor(img,code)
img = cv.imread('img\cat1.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) #RBG轉換為灰度圖
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV) #RBG轉換為HSV
cv.imshow('img',img)
cv.imshow('gray',gray)
cv.imshow('hsv',hsv)
cv.waitKey(0)
cv.destroyAllWindows()

二、灰度化

  • 灰度化是圖像處理以及計算機視覺的常用操作,就是將彩色圖像轉換為灰度圖像的過程
  • 灰度圖只有一個通道,以下介紹三種方法進行灰度化

1.最大值法

  • 顧名思義就是將RBG三通道中的最大值取出作為灰度圖的像素值
img = cv.imread('img\cat1.png')
h,w,_ = img.shape
img1 = np.zeros((h,w),dtype=np.uint8)
for i in range(h):for j in range(w):arr = img[i][j]max_val = max(arr[0],arr[1],arr[2])img1[i][j] = max_val
cv.imshow('img1',img1)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

2.平均值法

  • 將RBG三通道的像素值取平均值取出作為灰度圖的像素值
img = cv.imread('img\cat1.png')
h,w,_ = img.shape
img1 = np.zeros((h,w),dtype=np.uint8)
for i in range(h):for j in range(w):arr = img[i][j]mean_val = np.uint8(int(img[i][j][0])+int(img[i][j][1])+int(img[i][j][2])//3)img1[i][j] = max_val
cv.imshow('img1',img1)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

tips:在之前的章節提到,圖像是uint8類型的數組,使用Numpy的加法是取模運算,使用int函數進行類型轉換可以避免數據溢出

3.加權均值法

  • 與均值法類似,只不過為每個通道的像素值加入了權重
img = cv.imread('img\cat1.png')
h,w,_ = img.shape
wr,wg,wb = 0.3,0.5,0.2
img1 = np.zeros((h,w),dtype=np.uint8)
for i in range(h):for j in range(w):val = round(wb*img[i][j][0] + wg*img[i][j][1] + wr*img[i][j][2])img1[i][j] = val
cv.imshow('img1',img1)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

三、二值化

  • 在對圖像進行灰度化處理后,我們可以進一步對圖像進行二值化操作(也就是二值化的操作對象必須是灰度圖),使得圖像的所有像素值只有兩種值
  • 通過二值化處理,能夠幫助我們更好地分析圖像中的形狀、邊緣和輪廓等特征
  • 以下介紹幾種常用的二值化處理方法

1.全局閾值法

  • 對于整個灰度圖像,只設定一個閾值

1.閾值法(THRESH_BINARY)

  • 通過設定一個閾值,將灰度圖中每一個點的像素值與之比較,如果小于閾值則設置為0,否則設置為maxval(需要自定義,通常設定為255)

2.反閾值法(THRESH_BINARY_INV)

  • 與閾值法操作相反,即將灰度圖中每一個點的像素值與之比較,如果小于閾值則設置為maxval,否則設置為0

3.截斷閾值法(THRESH_TRUNC)

  • 該方法將灰度圖中每一個點的像素值與閾值比較,大于閾值的設置為閾值,否則不改變

4.低閾值零處理(THRESH_TOZERO)

  • 該方法將灰度圖中每一個點的像素值與閾值比較,低于閾值設置為0,否則不變

5.超閾值零處理(THRESH_TOZERO_INV)

  • 該方法將灰度圖中每一個點的像素值與閾值比較,低于閾值不變,高于閾值設置為0

6.OTSU算法

  • 該算法較為特殊,不是單純的閾值方法,通常它會結合THRESH_BINARYTHRESH_BINARY_INV
  • OTSU算法是通過一個值將這張圖分前景色和背景色(也就是灰度圖中小于這個值的是一類,大于這個值的是一類。例如,如果你設置閾值為128,則所有大于128的像素點可以被視作前景,而小于等于128的像素點則被視為背景。
  • 該算法將自動計算閾值
  • OTSU算法就是在灰度圖的像素值范圍內遍歷閾值T,使得g((類間方差))最大,基本上雙峰圖片的閾值T在兩峰之間的谷底
    在這里插入圖片描述

7.代碼展示

img = cv.imread('img\cat1.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)_,binary = cv.threshold(gray,thresh=150,maxval=255,type=cv.THRESH_BINARY) #閾值法
_,binary_inv = cv.threshold(gray,thresh=150,maxval=255,type=cv.THRESH_BINARY_INV) #反閾值法
_,binary_tru = cv.threshold(gray,thresh=150,maxval=255,type=cv.THRESH_TRUNC) #截斷閾值法
_,binary_zero = cv.threshold(gray,thresh=150,maxval=255,type=cv.THRESH_TOZERO) #低閾值零處理
_,binary_zero_inv = cv.threshold(gray,thresh=150,maxval=255,type=cv.THRESH_TOZERO_INV) #超閾值零處理
_,otsu = cv.threshold(gray,thresh=150,maxval=255,type=cv.THRESH_OTSU) #OTSU閾值法,默認結合閾值法
adapt = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,3,10)
adapt_guass = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,3,10)
cv.imshow('gray',binary)
cv.imshow('gray1',binary_inv)
cv.imshow('gray2',binary_tru)
cv.imshow('gray3',binary_zero)
cv.imshow('gray4',binary_zero_inv)
cv.imshow('otsu',otsu)
cv.imshow('adapt',adapt)
cv.imshow('adapt',adapt_guass)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

2.局部閾值法

  • 當圖片呈現出明暗分布不均勻的時候,如果繼續使用全局閾值法可能導致結果不夠準確,這時候我們可以使用自適應二值化的方法,對每一個像素點計算一個閾值,在結合普通的閾值法或反閾值法即可得到更加準確的結果

  • cv2.adaptiveThreshold(image_np_gray, maxval, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10)

  • maxval:最大閾值,一般為255

  • adaptiveMethod:小區域閾值的計算方式:

  • thresholdType:二值化方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,也就是閾值法和反閾值法

  • blockSize:選取的小區域的面積,如7就是7*7的小塊。

  • c:最終閾值等于小區域計算出的閾值再減去此值

  • ADAPTIVE_THRESH_MEAN_C:小區域內取均值

    • 該方法使用指定大小的區域,計算區域內像素點的均值
      在這里插入圖片描述
adapt = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,3,10)
  • ADAPTIVE_THRESH_GAUSSIAN_C:小區域內加權求和,權重是個高斯核
    • 該方法對指定大小區域內像素求加權均值,權重來自高斯分布
    • 在opencv里,當kernel(小區域)的尺寸為1、3、5、7并且用戶沒有設置sigma的時候(sigma <= 0),核值就會取固定的系數,這是一種默認的值是高斯函數的近似
      在這里插入圖片描述
    • 比如kernel的尺寸為3*3時,使用
      [ 0.25 0.5 0.25 ] × [ 0.25 0.5 0.25 ] \left[\begin{array}{c}{{0.25}}\\ {{0.5}}\\ {{0.25}}\end{array}\right]\times\left[0.25~~~~0.5~~~~0.25\right] ?0.250.50.25? ?×[0.25????0.5????0.25]
      進行矩陣的乘法,就會得到如下的權重值,其他的類似。
      k e r n e l = [ 0.0625 0.125 0.0625 0.125 0.25 0.125 0.0625 0.125 0.0625 ] kernel=\left[\begin{array}{c}{{0.0625~~~0.125~~~0.0625}}\\{{0.125~~~~0.25~~~~0.125}}\\ {{0.0625~~~0.125~~~0.0625}} \end{array}\right] kernel= ?0.0625???0.125???0.06250.125????0.25????0.1250.0625???0.125???0.0625? ?
      通過這個高斯核,即可對圖片中的每個像素去計算其閾值,并將該閾值減去固定值得到最終值
      在這里插入圖片描述
adapt_guass = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,3,10)

tips:使用高斯核可以降低噪聲對二值化的干擾,因為通常噪聲原理所選定的區域,對應的權重較小,對最終結果的影響也就越小


THE END

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

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

相關文章

威鋒VL822-Q7T10GHUB芯片適用于擴展塢顯示器

一、概述 VL822-Q7T是VIA Lab&#xff08;威盛電子旗下專注于USB相關技術研發的子公司&#xff09;精心打造的一款高性能USB 3.1 Gen2集線器控制器芯片。在當今數字化時代&#xff0c;USB接口作為設備連接與數據傳輸的核心通道&#xff0c;其性能與穩定性至關重要。VL822-Q7T憑…

華為OD機試真題——最小的調整次數/特異性雙端隊列(2025A卷:100分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《最小的調…

關于 Spring Boot 微服務解決方案的對比,并以 Spring Cloud Alibaba 為例,詳細說明其核心組件的使用方式、配置及代碼示例

以下是關于 Spring Boot 微服務解決方案的對比&#xff0c;并以 Spring Cloud Alibaba 為例&#xff0c;詳細說明其核心組件的使用方式、配置及代碼示例&#xff1a; 關于 Spring Cloud Alibaba 致力于提供微服務開發的一站式解決方案! https://sca.aliyun.com/?spm7145af80…

常見的爬蟲算法

1.base64加密 base64是什么 Base64編碼&#xff0c;是由64個字符組成編碼集&#xff1a;26個大寫字母AZ&#xff0c;26個小寫字母az&#xff0c;10個數字0~9&#xff0c;符號“”與符號“/”。Base64編碼的基本思路是將原始數據的三個字節拆分轉化為四個字節&#xff0c;然后…

B樹、紅黑樹、B+樹和平衡二叉樹(如AVL樹)的區別

B樹、紅黑樹、B樹和平衡二叉樹&#xff08;如AVL樹&#xff09;的區別及優缺點的總結&#xff1a; 1. 平衡二叉樹&#xff08;AVL樹&#xff09; 結構&#xff1a;二叉搜索樹&#xff0c;每個節點的左右子樹高度差不超過1。平衡方式&#xff1a;通過旋轉&#xff08;左旋/右旋…

Python Cookbook-6.5 繼承的替代方案——自動托管

任務 你需要從某個類或者類型繼承&#xff0c;但是需要對繼承做一些調整。比如&#xff0c;需要選擇性地隱藏某些基類的方法&#xff0c;而繼承并不能做到這一點。 解決方案 繼承是很方便的&#xff0c;但它并不是萬用良藥。比如&#xff0c;它無法讓你隱藏基類的方法或者屬…

長短期記憶網絡:從理論到創新應用的深度剖析

一、引言 1.1 研究背景 深度學習在人工智能領域的發展可謂突飛猛進&#xff0c;而長短期記憶網絡&#xff08;LSTM&#xff09;在其中占據著至關重要的地位。隨著數據量的不斷增長和對時序數據處理需求的增加&#xff0c;傳統的神經網絡在處理長序列數據時面臨著梯度消失和梯…

vue3.2 + element-plus 實現跟隨input輸入框的彈框,彈框里可以分組或tab形式顯示選項

效果 基礎用法&#xff08;分組選項&#xff09; 高級用法&#xff08;帶Tab欄&#xff09; <!-- 彈窗跟隨通用組件 SmartSelector.vue --> <!-- 彈窗跟隨通用組件 --> <template><div class"smart-selector-container"><el-popove…

C語言中冒泡排序和快速排序的區別

冒泡排序和快速排序都是常見的排序算法&#xff0c;但它們在原理、效率和應用場景等方面存在顯著區別。以下是兩者的詳細對比&#xff1a; 一、算法原理 1. 冒泡排序 原理&#xff1a;通過重復遍歷數組&#xff0c;比較相鄰元素的大小&#xff0c;并在必要時交換它們的位置。…

軟件信息安全性測試如何進行?有哪些注意事項?

隨著信息技術的高速發展&#xff0c;軟件已經成為我們生活和工作中不可或缺的一部分。然而&#xff0c;隨著軟件產品的廣泛普及&#xff0c;軟件信息安全性問題也日益凸顯&#xff0c;因此軟件信息安全性測試必不可少。那么軟件信息安全性測試應如何進行呢?在進行過程中又有哪…

springboot集成mybaits-generator自動生成代碼

文章目錄 概述創建springboot項目pom文件aplication.yml代碼生成類mybatis-plus提供的變量controller模板mapper模板總結 概述 創建springboot項目&#xff0c;在這里使用的是springboot 2.6.13版本&#xff0c;引入的項目依賴包如pom文件所寫&#xff0c;jdk使用1.8&#xff…

數據庫脫褲

假設你已經getshell 找到mysql賬號密碼。 網站要連接mysql&#xff0c;就需要把mysql的賬號密碼保存在一個php文件中&#xff0c;類似config.php、common.inc.php等&#xff0c;在shell中&#xff0c;讀取這些文件&#xff0c;找到其中信息即可 下面是一些常見平臺的配置文…

leetcode 337. House Robber III

用動態規劃的思想解決這道題。 對于每一個節點&#xff0c;只有兩種可能&#xff0c;偷或者不偷。 對于一顆以root為根節點的二叉樹&#xff0c;定義rob表示偷root節點能從這棵二叉樹偷到的最大金額。定義notrob表示不偷root節點能從這棵二叉樹偷到的最大金額。 遞推公式分析…

ES和MySQL概念對比

基本概念 ES和MySQL都屬于數據庫&#xff0c;不過各有各的特性&#xff0c;大致使用方法與MySQL類似并無區別。 MySQL&#xff1a;擅長事務持有ACID的特性&#xff0c;確保數據的一致性和安全。 ES&#xff1a;持有倒排索引&#xff0c;適合海量數據搜索和分析。 ES和MySQL如何…

【python】針對Selenium中彈框信息無法定位的問題,以下是綜合解決方案及注意事項:

一、常見原因分析 1.1 彈窗類型不匹配 若彈窗為alert&#xff0c;需使用driver.switch_to.alert處理&#xff1b; 若為confirm或prompt&#xff0c;同樣適用該方法。 1.2 窗口句柄切換問題 新窗口或彈窗可能開啟新句柄&#xff0c;需先通過driver.window_handles切換到對應句…

歐拉服務器操作系統安裝MySQL

1. 安裝MySQL服務器?? 1. 更新倉庫緩存 sudo dnf makecache2. 安裝MySQL sudo dnf install mysql-server2. 初始化數據庫? sudo mysqld --initialize --usermysql3. 啟動數據庫服務 # 啟動服務 sudo systemctl start mysqld# 設置開機自啟 sudo systemctl enable mysql…

SQLark:一款國產免費數據庫開發和管理工具

SQLark&#xff08;百靈連接&#xff09;是一款面向信創應用開發者的數據庫開發和管理工具&#xff0c;用于快速查詢、創建和管理不同類型的數據庫系統&#xff0c;目前可以支持達夢數據庫、Oracle 以及 MySQL。 對象管理 SQLark 支持豐富的數據庫對象管理功能&#xff0c;包括…

Spring Boot 中的自動配置原理

2025/4/6 向全棧工程師邁進&#xff01; 一、自動配置 所謂的自動配置原理就是遵循約定大約配置的原則&#xff0c;在boot工程程序啟動后&#xff0c;起步依賴中的一些bean對象會自動的注入到IOC容器中。 在講解Spring Boot 中bean對象的管理的時候&#xff0c;我們注入bean對…

Mysql8配置文件

Mysql8配置文件 修改my.cnf----配置持久化鍵(persistence key)配置表名不區分大小寫 修改my.cnf----配置持久化鍵(persistence key) MySQL8初始化數據庫之前配置好這些變量值&#xff0c;初始化數據庫之后可能無法修改這個值。 # 服務端配置 [mysqld] ######## 數據目錄和基…

關于系統架構思考,如何設計實現系統的高可用?

緒論、系統高可用的必要性 系統高可用為了保持業務連續性保障&#xff0c;以及停機成本量化&#xff0c;比如在以前的雙十一當天如果出現宕機&#xff0c;那將會損失多少錢&#xff1f;比如最近幾年Amazon 2021年30分鐘宕機損失$5.6M。當然也有成功的案例&#xff0c;比如異地…