【秣厲科技】LabVIEW工具包——OpenCV 教程(19):拾遺 - imgproc 基礎操作(上)

文章目錄

  • 前言
  • imgproc 基礎操作(上)
    • 1. 顏色空間
    • 2. 直方圖
    • 3. 二值化
    • 4. 腐蝕、膨脹、開閉運算
    • 5. 梯度與輪廓
    • 6. 簡易繪圖
    • 7. 重映射
  • 總結


前言

  1. 需要下載安裝OpenCV工具包的朋友,請前往 此處 ;
  2. 系統要求:Windows系統,LabVIEW>=2018,兼容32位和64位。

imgproc 基礎操作(上)

本文對于之前教程中,未曾集中詳細講解的基礎圖像處理內容,進行必要的補充

這些功能基本都來源于 imgproc 模塊,大概可以分為以下幾個方面。

1. 顏色空間

此內容之前已有教程,詳見:【秣厲科技】LabVIEW工具包——OpenCV 教程(4):顏色空間


2. 直方圖

直方圖是一種統計表示方法,用于展示圖像中不同像素強度出現的頻率分布。

OpenCV中,用 calcHist 函數計算直方圖,簡單用法如下:

  • 例2-1:灰度圖的直方圖統計,區間數為5,均勻分割 8U 范圍(0~255)

  • 作為常用的一維直方圖,其輸出結果 Hist 是個列向量,每一個數值代表相應灰度區間內的像素數。
    在這里插入圖片描述

  • calcHist 參數含義:

參數含義
ImageArrayMat 數組,存儲一張或多張輸入圖像,尺寸必須一致
Hist一個 Mat 對象,直方圖統計結果的輸出容器,類型為 32F
channelsint 數組,指定需要做直方圖統計的通道序號。當 ImageArray 包含多張圖片時,通道序號依次遞增,比如第一張包含3個通道,序號為0、1、2;第二張也包含3個通道,序號為3、4、5,以此類推。

channels 只包含一個通道序號時,代表最常用的一維直方圖;當包含多個通道序號時,則是多維直方圖。
histSizeint 數組,指定每個通道(維度)的直方圖數量
rangesfloat 數組,指定每個通道中像素強度(灰度)值的統計范圍。
當 uniform 為真,ranges 每通道只需兩個數值,即(總下限,總上限),將自動平均分割成 histSize 指定的份數;
當 uniform 為假,ranges 每通道需手動分割,如(h0,h1,h2,h3)代表三個范圍 h0-h1,h1-h2,h2-h3 ;

以上的每個范圍都遵循 “包含左端,不包含右端” 的原則,即左閉右開。
uniform布爾值,均一化標志,其功能如上面 ranges 所述。
accumulate布爾值,累加標志。
當 accumulate 為假,函數左端傳入的 Hist 將被清空后,再寫入本次直方圖統計結果;
當 accumulate 為真,函數左端傳入的 Hist 不會被清空,而是直接累加上本次直方圖統計結果。
MaskMat 類型的掩碼,可選參數,不連接代表全圖參與統計。
  • 例2-2:灰度圖的直方圖統計,自定義非均勻分割區間

在這里插入圖片描述

  • 例2-3:將兩張彩色圖片的 R通道 直方圖累加在一起
  • 通道順序是BGR,所以兩張圖片R通道的序號分別是2和5;
  • 第一次 calcHist 的 accumulate 參數是真、假都可以,因為傳入的 Hist 初始為空矩陣;
  • 但第二次 calcHist 的 accumulate 參數必須為真,才能實現累加。

在這里插入圖片描述

  • 例2-4:二維直方圖范例
  • channels 同時給定2個通道序號,histSize 和 ranges 指定兩組分割區間,將進行二維直方圖統計;
  • 假如兩組區間數分別為 M 和 N,那么輸出的二維直方圖尺寸就是 M x N;
  • 每個元素 Hist (i,j) 代表 同時滿足 “第1個通道強度值落在第1組的第 i 區間,第2個通道強度值落在第2組的第 j 區間” 的像素數;
  • 不難看出,將二維直方圖 “行向累加” 成一列,就是第1個通道的一維直方圖;“列向累加” 成一行,就是第2個通道的一維直方圖。

在這里插入圖片描述


3. 二值化

二值化的任務,是將一張灰度圖,按照設定的閾值,轉化成僅有黑白兩種顏色的單通道圖像。

OpenCV中,用 threshold 函數實現灰度圖的二值化,簡單用法如下:

  • 例3-1:灰度圖二值化,閾值127,最大值255,反向模式(大于閾值時置0,小于等于閾值時置最大值)

在這里插入圖片描述

  • threshold 參數含義:
參數含義
srcImage源圖像
dstImage目標圖像,即二值化的結果
thresh閾值
maxval最大值,即二值中的較大值(最小值固定為0)
type轉化類型,共 8 種,含義見下表
retValue(返回值)當 type 設為 OTSU 或 TRIANGLE 時,返回自適應的閾值;否則原樣返回 thresh 參數值。
type類型含義
THRESH_BINARY閾值二值化模式,大于閾值時置 maxval ,小于等于閾值時置 0
THRESH_BINARY_INV反向閾值二值化模式,大于閾值時置 0 ,小于等于閾值時置 maxval
THRESH_TRUNC截斷模式,大于閾值時置 thresh ,小于等于閾值時維持原值
THRESH_TOZERO取零模式,大于閾值時維持原值,小于等于閾值時置 0
THRESH_TOZERO_INV反向取零模式,大于閾值時置 0 ,小于等于閾值時維持原值
THRESH_MASK返回掩碼(本類型已不支持,冗余殘留)
THRESH_OTSUOTSU 自適應 閾值, 基于區分前景和背景。通常與其他模式疊加使用
THRESH_TRIANGLETRIANGLE 自適應 閾值, 基于尋找直方圖雙峰之間的谷底。 通常與其他模式疊加使用
  • 例3-2:灰度圖二值化,采用OTSU自動確定閾值,再按 THRESH_BINARY_INV 模式轉化

在這里插入圖片描述


4. 腐蝕、膨脹、開閉運算

腐蝕、膨脹、開閉運算都屬于形態學操作,這些通常在二值化圖像上進行。通過特殊的濾波規則,實現二值圖中白色區域的收縮、擴張、去噪、聯通、邊緣潤滑等效果。先腐蝕后膨脹,稱為開運算;先膨脹后腐蝕,稱為閉運算。

相關函數如下表:

函數功能
erode腐蝕,白色區域收縮,孤立的小型白色區域(噪聲點)甚至完全消失
dilate膨脹, 白色區域擴張,孤立的小型黑色區域(噪聲點)甚至完全消失
morphology可實現多種形態學運算,包括腐蝕、膨脹、開運算 和 閉運算(取決于 op 參數)
getStructuringElement生成結構元素(一個小型二維Mat),作為上述運算的濾波 “核”
  • 例4-1:對同一個二值圖,用 9x9 的矩形核,分別進行腐蝕、膨脹、開運算
  • 參考范例:examples/Molitec/OpenCV/imgproc/imgproc_3(binary).vi
  • 簡單說明參數:
    anchor 是錨點,即 “核” 在圖像上移動時的參考點,默認(-1,-1)代表中心點?;
    iterations 是迭代次數;
    borderType 邊界像素外推的方法,默認為 BORDER_CONSTANT ,即常量填充;
    borderValue 邊界填充值,默認為 64F 的最大值 1.797693134862E+308 ;
    op 是 morphology 函數獨有的參數,定義操作類型。開運算 MORPH_OPEN ,閉運算 MORPH_CLOSE;

在這里插入圖片描述

在這里插入圖片描述


5. 梯度與輪廓

圖像梯度指的是像素強度(灰度)的變化率,可以用來確定圖像的邊緣輪廓。

OpenCV中,常用的邊緣檢測函數包括:Canny、Scharr、Sobel 和 Laplacian。

其中 Canny 是個多態VI,包含 image 輸入 和 dxdy 輸入 兩種模式。

  • 例5-1:對同一個灰度圖,分別用 Canny、Scharr、Sobel 和 Laplacian 進行梯度計算和邊緣檢測
  • 參考范例:examples/Molitec/OpenCV/imgproc/imgproc_4(gradient).vi

在這里插入圖片描述
在這里插入圖片描述

  • 各函數的 params 參數說明
Canny參數含義
threshold1低閾值,像素梯度低于這個閾值的,一定不是邊緣。
threshold2高閾值,像素梯度高于這個閾值的,一定是邊緣,且為 “強邊緣”。
如果介于兩個閾值之間,只有與強邊緣相鄰時,才被視為邊緣的一部分。
apertureSizeSobel 算子尺寸,必須取1、3、5 或 7。 默認為3,代表使用 3x3 的卷積核計算梯度。
L2gradient布爾值,為真代表使用L2范數(歐幾里得距離),為假代表使用L1范數(曼哈頓距離)
Scharr參數
ddepth目標圖像深度(數據類型,如 CV_8U 等),默認為-1,代表與源圖像深度相同。
dxx方向的求導階數。0表示不計算x方向導數。
dyy方向的求導階數。0表示不計算y方向導數。
scale計算導數時的縮放因子,默認為1。
delta增量值,加到計算出的導數上,默認值為0。
borderType邊界類型,默認為 BORDER_DEFAULT,等同于 BORDER_REFLECT_101
Sobel參數
ddepth同上
dx同上
dy同上
ksizeSobel 算子尺寸,必須取1、3、5 或 7。
scale同上
delta同上
borderType同上
Laplacian參數
ddepth同上
ksizeLaplacian 算子尺寸,必須是奇數。
scale同上
delta同上
borderType同上
  • 例5-2:采用 spatialGradient 分別計算dx、dy,再用 Canny 的dxdy模式進行邊緣檢測
  • 這相當于把 例5-1 的 Canny 計算過程一分為二。

在這里插入圖片描述

在經過 Canny、Scharr、Sobel 和 Laplacian 計算之后,我們往往需要把其中的邊緣輪廓提取出來,也就是把輸出的二值圖中 “連續的白色像素” 的坐標連接在一起,形成輪廓線條。

在OpenCV中,可以使用 findContours 提取梯度二值圖中的輪廓線條。

  • 例5-3:使用 Canny + findContours 計算梯度并提取輪廓,最后用 drawContours 繪制輪廓
  • findContours 參數
  • mode 定義輪廓檢索模式,默認 RETR_EXTERNAL 代表只檢索最外層的輪廓;
  • method 定義輪廓近似方法,默認 CHAIN_APPROX_SIMPLE 代表簡單近似法;
  • offset 是坐標偏移量,默認(0,0);
  • 輸出 contours? 是輪廓結果,其中 pts 數組是全部點坐標序列,npts 代表每個輪廓包含的點數,ncontours 代表輪廓個數。這與之前教程(5)中 drawContours 的輸入參數定義相同;
  • 輸出 hierarchy 代表輪廓的層次結構,是1個(輪廓個數 x 4)的二維數組。每行4個整數,依次代表本行索引號輪廓的 “上一個、下一個、第一個、最后一個” 輪廓的索引號。-1 表示沒有。

在這里插入圖片描述

在這里插入圖片描述

從上圖 hierarchy 輸出可以分析:
第0行(1,-1,-1,-1)代表0號輪廓的上一個是1號輪廓,下一個是 -1(沒有);
第1行(2,0,-1,-1)代表1號輪廓的上一個是2號輪廓,下一個是0號輪廓;
第2行(3,1,-1,-1)代表2號輪廓的上一個是3號輪廓,下一個是1號輪廓;

最終得出,這6個輪廓的先后順序為:5,4,3,2,1,0


6. 簡易繪圖

此內容之前已有教程,詳見:【秣厲科技】LabVIEW工具包——OpenCV 教程(5):簡易繪圖


7. 重映射

圖像重映射,指的是按照一定規則,重新排布源圖像中的像素坐標位置,并渲染到目標圖像中。

之前教程提到的 resize 就是一種重映射,用于實現圖片的縮放。

  • 例7-1:使用 resize 將源圖像尺寸縮小到原來的一半
  • resize 參數
  • dsize:目標圖像尺寸。如果 dsize 不為0,輸出圖像尺寸以 dsize 為準;否則,將由下面的 fx、fy 計算決定;
  • fx:水平方向縮放因子;
  • fy:垂直方向縮放因子;
  • interpolation:插值方法,指的是當放大圖像時,填補空缺的方法。默認 ?INTER_LINEAR 雙線性插值法。

在這里插入圖片描述

下面,再介紹兩種可以扭曲源圖像形狀的重映射:仿射變換(warpAffine)和 透視變換(warpPerspective)。

  • 例7-2:分別使用 warpAffine 和 warpPerspective,將圖片中一塊 “四邊形” 區域重映射成 “矩形”
  • 參考范例:examples/Molitec/OpenCV/imgproc/imgproc_7(wrap).vi
  • 首先,錨定源圖像四邊形的4個頂點,再給定輸出矩形的4個頂點,將這兩組頂點分別輸入到 getAffineTransform 和 getPerspectiveTransform 中,運行得到各自的變換矩陣 M;
  • 接著,使用 warpAffine 配合 getAffineTransform 輸出的 M,完成仿射變換;
  • 使用 warpPerspective 配合 getPerspectiveTransform 輸出的 M,完成透視變換;

在這里插入圖片描述

在這里插入圖片描述

如果你想完全自定義一種映射關系,即手動給定每一個像素在新圖像中的坐標位置,那么可以使用 remap 函數。

  • 例7-3:使用 remap 實現圖片的水平翻轉
  • remap 函數 VI 的上方需要輸入兩個 Mat 參數,名稱分別為 map1 和 map2,用于逐像素指定映射后的新坐標;
  • 上述 map1 和 map2 有兩種組織方式:
    其一,map1 和 map2 都是單通道矩陣,那么 map1 指定所有像素映射之后的X坐標,map2 指定Y坐標;
    其二,map1 是雙通道矩陣,那么由 map1 獨自指定(X,Y)坐標,而 map2 為空矩陣 即可。
  • 參考范例:examples/Molitec/OpenCV/imgproc/imgproc_6(remap).vi

在這里插入圖片描述

順便一提,如果只是需要進行圖片翻轉、旋轉這樣常規的操作,那完全沒必要用到 remap。使用 core 模塊下的 flip 和 rotate 等函數,就完全可以做到,而且更為簡潔。

core 模塊下也有不少重映射的方法,感興趣的讀者可以試一試。

在這里插入圖片描述


總結

  1. 本系列博文作為LabVIEW工具包—OpenCV的教程,將以專欄的形式陸續發布和更新。
  2. 對工具包感興趣的朋友,歡迎下載試用:秣厲科技 - LabVIEW工具包 - OpenCV
  3. 各位看官有什么想法、建議、吐槽、批評,或新奇的需求,也歡迎留言討論。

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

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

相關文章

Linux 下 Module 工具的介紹與使用

參考: https://www.fasteda.cn/post/22.html https://modules.readthedocs.io/en/latest/module.html Linux 下 Module 工具的介紹與使用 一、前言 在 Linux 中,當同一款編輯器、運行庫、軟件存在多個版本且多個版本都需要在不同的場景或人員使用時&a…

空間信息可視化——WebGIS前端實例(一)

技術棧:原生HTML 源代碼:CUGLin/WebGIS: This is a project of Spatial information visualization 4 全國貧困縣可視化系統 4.1 系統設計思想 黨的十九大報告明確指出,要“確保到2020年我國現行標準下農村貧困人口實現脫貧,貧困縣全部摘帽,解決區域…

單雙線程的理解 和 lua基礎語法

1.什么是單進程 ,什么是多進程 當一個程序開始運行時,它就是一個進程,進程包括運行中的程序和程序所使用到的內存和系統資源。而一個進程又是由單個或多個線程所組成的。 1.1 像apache nginx 這類 服務器中間件就是多進程的軟件 &#xff0…

【Linux】VIM 編輯器,編輯加速引擎

目錄 vim中的五種常見模式介紹VIM的基本操作安裝VIMVIM中的模式切換 VIM指令集命令模式指令集底行模式指令集視圖模式指令集替換和插入模式 end vim中的五種常見模式介紹 正常/普通/命令模式【Normal mode】 控制屏幕光標的移動,字符、字或行的刪除,移動…

【Linux網絡】Socket 編程TCP

🌈個人主頁:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 🔥 系列專欄:https://blog.csdn.net/qinjh_/category_12891150.html 目錄 TCP socket API 詳解 socket(): bind(): listen(): accept(): connect V0…

記一次 .NET某固高運動卡測試 卡慢分析

一:背景 1. 講故事 年前有位朋友找到我,說他們的程序會偶發性卡慢 10s 鐘,在某些組合下會正常,某些組合下就會出現問題,解釋不了其中的原因,讓我幫忙看下怎么回事?截圖如下: priva…

硬件知識積累 單片機+ 光耦 + 繼電器需要注意的地方

1. 電路圖 與其數值描述 1.1 單片機引腳信號為 OPtoCoupler_control_4 PC817SB 為 光耦 繼電器 SRD-05VDC-SL-A 的線圈電壓為 67Ω。 2. 需注意的地方 1. 單片機的推挽輸出的電流最大為 25mA 2. 注意光耦的 CTR 參數 3. 注意繼電器線圈的 內阻 4. 繼電器的開啟電壓。 因為光耦…

IP組播技術與internet

1.MAC地址分為三類:廣播地址;組播地址;單播地址 2.由一個源向一組主機發送信息的傳輸方式稱為組播。 3.組播MAC地址,第一個字節的最后一位為1; 單播MAC地址,第一個字節的最后一位為0; 4.不能…

vue3+vite+ts使用daisyui/tailwindcss

vite創建vue3腳手架 npm init vitelatest myVue3 – --template vue cd .\myVue3\ npm i npm run dev 安裝tailwindcss/daisyui 依賴安裝 npm install -D tailwindcss postcss autoprefixer daisyui npx tailwindcss init -p 這條命令將生成postcss.config.js(因為加了…

大數據(7)Kafka核心原理揭秘:從入門到企業級實戰應用

目錄 一、大數據時代的技術革命1.1 消息中間件演進史1.2 Kafka核心設計哲學 二、架構深度解構2.1 核心組件拓撲2.1.1 副本同步機制(ISR) 2.2 生產者黑科技2.3 消費者演進路線 三、企業級應用實戰3.1 金融行業實時風控3.2 物聯網數據管道 四、生產環境優化…

spring boot大文件與多文件下載

一、簡單大文件下載&#xff1a; /*** 下載大文件* param path 路徑* param fileName 文件名* return* throws IOException*/ public static ResponseEntity<InputStreamResource> downloadFile(String path, String fileName) throws IOException {Path filePath Path…

第二節:React 基礎篇-受控組件 vs 非受控組件

一、場景題&#xff1a;設計一個實時搜索輸入框&#xff0c;說明選擇依據 受控組件 vs 非受控組件 核心區別 特征受控組件非受控組件數據管理由React狀態&#xff08;state&#xff09;控制通過DOM元素&#xff08;ref&#xff09;直接訪問更新時機每次輸入觸發onChange提交…

局部路由守衛

局部路由守衛為我們提供了更細粒度的路由控制&#xff0c;允許我們在特定的路由或組件級別添加鑒權和邏輯處理。局部路由守衛分為 path 守衛和 component 守衛&#xff0c;它們分別適用于不同的場景。 path 守衛&#xff08;路由守衛&#xff09; path 守衛用于在進入特定路由…

Android 16應用適配指南

Android 16版本特性介紹 https://developer.android.com/about/versions/16?hlzh-cn Android 16 所有功能和 API 概覽 https://developer.android.com/about/versions/16/features?hlzh-cn#language-switching Android 16 發布時間 Android 16 適配指南 Google開發平臺&…

android display 筆記(十二)CPU,GPU,DPU的區別

CPU&#xff08;Central Processing Unit&#xff09;通用計算&#xff1a;處理復雜邏輯、分支預測、多任務調度。 低延遲&#xff1a;優先快速響應單線程任務。 GPU&#xff08;Graphics Processing Unit&#xff09; 高吞吐量并行計算&#xff1a;適合大規模數據并行處理。…

音頻轉文本:如何識別音頻成文字

Python腳本:MP4轉MP3并語音識別為中文 以下是一個完整的Python腳本,可以將MP4視頻轉換為MP3音頻,然后使用語音識別模型將音頻轉換為中文文本。 準備工作 首先需要安裝必要的庫: pip install moviepy pydub SpeechRecognition openai-whisper完整腳本 import os from m…

理解 MCP 協議的數據傳遞:HTTP 之上的一層“殼子

以下是以 CSDN 博客的風格記錄你對 MCP 協議數據傳遞的理解和發現&#xff0c;內容涵蓋了 MCP 協議基于 HTTP 的本質、JSON-RPC 的“殼子”作用&#xff0c;以及為什么熟悉 HTTP 協議就足以理解 MCP 的數據傳遞。文章面向技術社區&#xff0c;結構清晰&#xff0c;適合分享。 理…

基于ssm網絡游戲推薦系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 當今社會進入了科技進步、經濟社會快速發展的新時代。國際信息和學術交流也不斷加強&#xff0c;計算機技術對經濟社會發展和人民生活改善的影響也日益突出&#xff0c;人類的生存和思考方式也產生了變化。傳統網絡游戲管理采取了人工的管理方法&#xff0c;但這種管理方…

vue入門:指令

文章目錄 vue的內置指令說明&#xff1a; 自定義指令 vue的內置指令 Vue 指令的本質是&#xff1a; 聲明式的 DOM 操作接口&#xff08;隱藏底層 JavaScript 代碼&#xff09;。響應式數據的綁定媒介&#xff08;連接數據和視圖&#xff09;。模板編譯的標記&#xff08;最終…

oracle 索引失效

在 Oracle 11g 中&#xff0c;索引失效的常見原因包括函數修改列、隱式類型轉換、統計信息過時等&#xff0c;解決方法需結合版本特性&#xff08;如虛擬列、索引跳躍掃描&#xff09;。通過執行計劃分析、統計信息維護和合理使用提示&#xff08;Hints&#xff09;&#xff0c…