Python-初學openCV——圖像預處理(五)——梯度處理、邊緣檢測、圖像輪廓

目錄

一、圖像梯度處理

1、垂直邊緣提取

2、Sobel算子

3、Laplacian算子

二、圖像邊緣檢測

1、高斯濾波

2、計算圖像的梯度、方向

3、非極大值抑制

4、雙閾值篩選

?三、繪制圖像輪廓

1、概念

2、尋找輪廓

3、繪制輪廓


一、圖像梯度處理

? ? ? ? 還記得高數中的一階導數求極值嗎?把圖片想象成連續函數,因為邊緣部分的像素值是與旁邊像素明顯有區別的,所以對圖片局部求極值,就可以得到整幅圖片的邊緣信息了。不過圖片是二維的離散函數,導數就變成了差分,這個差分就稱為圖像的梯度

? ? ? ? 1、垂直邊緣提取

????????濾波是應用卷積來實現的,卷積的關鍵就是卷積核

這個核是用來提取圖片中的垂直邊緣的,當前列左右兩側的元素進行差分,由于邊緣的值明顯小于(或大于)周邊像素,所以邊緣的差分結果會明顯不同,這樣就提取出了垂直邊緣

cv2.filter2D(src, ddepth, kernel)

filter2D函數是用于對圖像進行二維卷積(濾波)操作。它允許自定義卷積核(kernel)來實現各種圖像處理效果,如平滑、銳化、邊緣檢測等

src: 輸入圖像

ddepth:輸出圖像的深度,可以是負值(表示與原圖相同)、正值或其他特定值(常用-1 表示輸出與輸入具有相同的深度)

kernel:卷積核,一個二維數組(通常為奇數大小的方形矩陣),用于計算每個像素周圍鄰域的加權和

?同理,把上面那個矩陣轉置一下,就是提取水平邊緣。這種差分操作就稱為圖像的梯度計算

(將卷積核中的矩陣換成k2矩陣即可實現水平邊緣提取,可以找張數獨的圖片效果對比更清晰)

?????????2、Sobel算子

? ? ? ? 上面的 k1、k2 兩個卷積核都叫做Sobel算子,只是方向不同

sobel_image = cv2.Sobel(src, ddepth, dx, dy, ksize)

src:通常應該是一個灰度圖像,因為 Sobel 算子是基于像素亮度梯度計算的。在彩色圖像的情況下,通常需要先將其轉換為灰度圖像

ddepth:輸出圖像的深度,即輸出圖像的數據類型(-1 表示輸出圖像的深度與輸入圖像相同 )

dx,dy:dx=1,dy=0時求x方向的一階導數,意味著我們想要計算圖像在水平方向(x軸)的梯度;

? ? ? ? ? ? ? ? dx=0,dy=1時求y方向的一階導數

ksize:Sobel算子的大小,可選擇3、5、7,默認為3

? ? ? ? 3、Laplacian算子

????????Laplacian算子是一種二階微分算子,通常用于圖像處理中,用來檢測圖像中的邊緣和細節。它對圖像的每個像素應用一個“加權平均”,通過計算每個像素與其鄰域像素的差異,來判斷該點的變化程度。Laplacian算子用于捕捉圖像中亮度變化劇烈的區域。常常用于邊緣檢測,因為邊緣區域的亮度變化非常大,而平坦區域的亮度變化較小。它的優點是能夠檢測到圖像的細節,包括邊緣、角點等

cv2.Laplacian(src, ddepth)

src:輸入圖像

ddepth:代表輸出圖像的深度 ,-1 表示輸出圖像的深度與輸入圖像相同

二、圖像邊緣檢測

(不是算子,接下來是一整套邊緣檢測的流程、方案)

? ? ? ? 1、高斯濾波

? ? ? ? ? ? ? ? 去除噪點,邊緣檢測本身屬于銳化操作,對噪點比較敏感,所以需要進行平滑處理

? ? ? ? 2、計算圖像的梯度、方向

????????????????首先使用sobel算子計算中心像素點的兩個方向上的梯度G_{x}和G_{y},然后就能夠得到? ? ? ? ? ?其具體的梯度值:G={\sqrt{G_{x}{}^{2}+G_{y}{}^{2}}}

????????????????也可以使用G=|G_{x}+G_{y}|來代替。在OpenCV中,默認使用G=|G_{x}+G_{y}|來計算? ? ? ? ? ?梯度值

?????????????????然后我們根據公式{\frac{G_{\mathrm{y}}}{G_{x}}}=\tan\,(\theta)可以得到一個角度值:\theta=\arctan\,({\frac{G_{\mathrm{y}}}{G_{x}}})

?這個角度值其實是當前邊緣的梯度的方向。通過這個公式我們就可以計算出圖片中所有的像素點的梯度值與梯度方向,然后根據梯度方向獲取邊緣的方向

并且如果梯度方向不是0°、45°、90°、135°這種特定角度,那么就要用到插值算法來計算當前像素點在其方向上進行插值的結果了,然后進行比較并判斷是否保留該像素點

\theta值為-22.5°~22.5°,或-157.5°~157.5°,則認為邊緣為水平邊緣;

當法線方向為22.5°~67.5°,或-112.5°~-157.5°,則認為邊緣為45°邊緣;

當法線方向為67.5°~112.5°,或-67.5°~-112.5°,則認為邊緣為垂直邊緣;

當法線方向為112.5°~157.5°,或-22.5°~-67.5°,則認為邊緣為135°邊緣;

? ? ? ? 3、非極大值抑制

????????得到每個邊緣的方向之后,其實把它們連起來邊緣檢測就算完了,但是為什么還有這一步與下一步呢?是因為經過第二步得到的邊緣不經過處理是沒辦法使用的,因為高斯濾波的原因,邊緣會變得模糊,導致經過第二步后得到的邊緣像素點非常多,因此我們需要對其進行一些過濾操作,而非極大值抑制就是一個很好的方法,它會對得到的邊緣像素進行一個排除,使邊緣盡可能細一點。

????????在該步驟中,我們需要檢查每個像素點的梯度方向上的相鄰像素,并保留梯度值最大的像素,將其他像素抑制為零。假設當前像素點為(x,y),其梯度方向是0°,梯度值為G(x,y),那么我們就需要比較G(x,y)與兩個相鄰像素的梯度值:G(x-1,y)和G(x+1,y)。如果G(x,y)是三個值里面最大的,就保留該像素值,否則將其抑制為零

? ? ? ? 4、雙閾值篩選

????????經過非極大值抑制之后,我們還需要設置閾值來進行篩選,當閾值設的太低,就會出現假邊緣,而閾值設的太高,一些較弱的邊緣就會被丟掉,因此使用了雙閾值來進行篩選,推薦高低閾值的比例為2:1到3:1之間。

????????當某一像素位置的幅值超過最高閾值時,該像素必是邊緣像素;當幅值低于最低像素時,該像素必不是邊緣像素;幅值處于最高像素與最低像素之間時,如果它能連接到一個高于閾值的邊緣時,則被認為是邊緣像素,否則就不會被認為是邊緣。也就是說,上圖中的A和C是邊緣,B不是邊緣。因為C雖然不超過最高閾值,但其與A相連,所以C就是邊緣

edges = cv2.Canny(image, threshold1, threshold2)

image:輸入的灰度/二值化圖像數據(即使讀到的是彩色圖也可以進行處理 )

threshold1:低閾值,用于決定可能的邊緣點

threshold2:高閾值,用于決定強邊緣點

?三、繪制圖像輪廓

? ? ? ? 1、概念

????????????????輪廓是一系列相連的點組成的曲線,代表了物體的基本外形。相對于邊緣,輪廓是連續? ? ? ? ? ?的,邊緣不一定連續,輪廓是一個閉合的、封閉的形狀

????????(輪廓的作用:形狀分析、目標識別、圖像分割)

? ? ? ? 2、尋找輪廓

????????????????尋找輪廓需要將圖像做一個二值化處理,并且根據圖像的不同選擇不同的二值化方法來? ? ? ? ? ?將圖像中要繪制輪廓的部分置為白色,其余部分置為黑色。也就是說,我們需要對原始的? ? ? ? ? ? ? ?圖像進行灰度化、二值化的處理,令目標區域顯示為白色,其他區域顯示為黑色。之后,對? ? ? ? ? ?圖像中的像素進行遍歷,當一個白色像素相鄰(上下左右及兩條對角線)位置有黑色像素存? ? ? ? ? ?在或者一個黑色像素相鄰(上下左右及兩條對角線)位置有白色像素存在時,那么該像素點? ? ? ? ? ?就會被認定為邊界像素點,輪廓就是有無數個這樣的邊界點組成的

contours,hierarchy = cv2.findContours(image,mode,method)

contours:獲取到的輪廓點的列表,檢測到有多少個輪廓,該列表就有多少子列表,每一個子列表都代表了一個輪廓中所有點的坐標

hierarchy:表示輪廓之間的關系,前一條輪廓、后一條輪廓、子輪廓、父輪廓(該參數的使用情況會比較少 )

image:輸入二值化圖像

mode:輪廓的檢索模式

????????????????RETR_EXTERNAL:只查找最外層的輪廓(只有前、后,沒有父、子)

????????????????RETR_LIST:列出所有的輪廓(只有前、后,沒有父、子)

????????????????RETR_CCOMP:列出所有的輪廓(分為兩個層級:0 外部輪廓,1 內部輪廓)

????????????????RETR_TREE????:列出所有的輪廓(輪廓按照樹的方式顯示:最外層樹根,子輪廓樹枝 )

method:輪廓的表示方法

????????????????CHAIN_APPROX_NONE:存儲所有輪廓點

????????????????CHAIN_APPROX_SIMPLE:只存儲有用的點(默認)

????????????????CHAIN_APPROX_TC89_L1:用 Teh-Chin 算法智能地簡化輪廓,點數更少

(對于mode和method這兩個參數來說,一般使用RETR_EXTERNAL和CHAIN_APPROX_SIMPLE這兩個選項 )

? ? ? ? ?3、繪制輪廓

????????????????輪廓找出來后,其實返回的是一個輪廓點坐標的列表,因此我們需要根據這些坐標將輪? ? ? ? ? ?廓畫出來,因此就用到了繪制輪廓的方法

cv2.drawContours(image, contours, contourIdx, color, thickness)

image:原始圖像,一般為單通道或三通道的 numpy 數組

contours:包含多個輪廓的列表,每個輪廓是一個由點坐標構成的二維數組(numpy數組)

contourldx:要繪制的輪廓索引。(如果設為 -1,則會繪制所有輪廓)

color:繪制輪廓的顏色,可以是 BGR 值或者是灰度值(對于灰度圖像)

thickness:輪廓線的寬度,如果是正數,則畫實線;如果是負數,則填充輪廓內的區域

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

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

相關文章

【Redis】安裝Redis,通用命令,常用數據結構,單線程模型

目錄 一.在Ubuntu系統安裝Redis 二. redis客戶端介紹 三. 全局命令 3.1.GET和SET命令 3.2.KEYS(生產環境禁止使用) 3.3.EXISTS 3.4.DEL 3.5.EXPIRE 3.6.TTL 3.6.1.Redis的過期策略 3.6.2.基于優先級隊列/堆的實現去實現定時器 3.6.3.定時器&a…

ubuntu22.04系統實踐 linux基礎入門命令(三) 用戶管理命令

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址:星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 之所以推薦給大家使用,是因為上面的云主機目前是免費使用的…

DPDK中的TCP頭部處理

1. TCP頭部結構 TCP頭部通常為20字節(不含可選字段),每個字段占據固定的字節位置。以下是TCP頭部的結構,按字節位置逐一說明:0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 …

開源在線客服系統Chatwoot配置文件

參考: https://developers.chatwoot.com/self-hosted/deployment/dockerhttps://developers.chatwoot.com/self-hosted/deployment/docker 1、.env 配置文件 # Learn about the various environment variables at # https://www.chatwoot.com/docs/self-hosted/co…

PHP進階語法詳解:命名空間、類型轉換與文件操作

掌握了PHP面向對象編程的基礎后,就可以深入學習命名空間、類型轉換、文檔注釋、序列化以及文件操作等重要概念。 1、命名空間(Namespace) 命名空間是PHP 5.3引入的重要特性,它解決了類名、函數名和常量名沖突的問題,使…

Webpack 搭建 Vue3 腳手架詳細步驟

創建一個新的 Vue 項目 1)初始化項目目錄 新建一個文件夾,或者使用以下指令 mkdir webpack-vue_demo cd webpack-vue_demo2)初始化 npm 項目 npm init -y3)安裝 vue 和 webpack 相關依賴 npm install vue vue-loader vue-template…

【Git 誤操作恢復指南】

Git 誤操作恢復指南 適用場景:git reset --hard 誤操作后的緊急恢復 風險等級:🔴 高風險 - 可能導致代碼丟失 恢復成功率:95%(CI/CD 環境下) 🚨 緊急情況概述 問題描述 在項目開發過程中&am…

Go語言 逃 逸 分 析

逃逸分析是什么 逃逸分析是編譯器用于決定變量分配到堆上還是棧上的一種行為。一個變量是在堆上分配,還是在棧上分配,是經過編譯器的逃逸分析之后得出的“結論”。Go 語言里編譯器的逃逸分析:它是編譯器執行靜態代碼分析后&#xff0c…

LeetCode算法日記 - Day 1: 移動零、復寫零

目錄 1. 移動零 1.1 思路解析 1.2 代碼實現 2. 復寫零 2.1 思路解析 2.2 代碼實現 1. 移動零 283. 移動零 - 力扣(LeetCode) 給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。 請…

Odoo:免費開源的醫療器械行業解決方案

開源智造Odoo專家團隊深知,作為醫療器械制造商,您的成功取決于制造卓越產品的能力。您必須遵循嚴密控制的流程,開發和制造出達到最嚴格質量標準的產品。“開源智造Odoo醫療器械行業解決方案”是為醫療器械制造商設計的全球企業資源規劃(ERP)軟…

Redis鍵值對中值的數據結構

前言 前面我們已經介紹了Redis的鍵值對存儲管理的底層數據結構。如果不清楚的同志可以看我前面的博客 Redis數據庫存儲鍵值對的底層原理-CSDN博客 下面,我們來看一下Redis鍵值對中值的數據結構有那些叭 Redis常見的5種數據類型 string …

MySQL自動化安裝工具-mysqldeploy

功能 可在linux系統上安裝 mysql5.5/5.6/5.7/8.0/8.4 版本的 MySQL,可以初始化多實例 MySQL。 碼云: https://gitee.com/hh688/mysqldeploy guithub: https://github.com/hhkens/mysqldeploy 限制 僅在 centos7 環境進行測試,后期可能支持更多系統。 此程…

簡要探討大型語言模型(LLMs)的發展歷史

關注大型語言模型(LLMs) 簡要探討語言模型的發展歷史 理解Transformer架構的基本元素和注意力機制 了解不同類型的微調方法 語言模型的大小之分 在語言模型領域,“小”和“大”是相對概念。幾年前還被視為“巨大”的模型,如今已被認為相當小。該領域發展迅猛,從參數規模為…

Java試題-選擇題(2)

Java試題-選擇題(2) 題目 下列語句創建對象的總個數是: String s=“a”+“b”+"c”+“d”+"e” A.4 B.2 C.3 D.1 關于下面的程序段的說法正確的是()? File file1=new File(“e:\xxx\yyy\zzz");file1.mkdir(); A.如目錄e:\xxx\yyy\不存在,程序會拋出FileN…

揭秘動態測試:軟件質量的實戰防線

動態測試概述(擴展版) 目錄 動態測試概述(擴展版) 一、動態測試的定義與重要性 ? 二、動態測試類型 🔍 (一)功能測試 🧩 (二)非功能測試 &#x1f4ca…

機器學習①【機器學習的定義以及核心思想、數據集:機器學習的“燃料”(組成和獲取)】

文章目錄先言一、什么是機器學習1.機器學習的定義以及核心思想2.機器學習的四大類型2.1監督學習(Supervised Learning)2.2半監督學習(Midsupervised Learning)2.3無監督學習(Unsupervised Learning)2.4強化…

GaussDB 數據庫架構師(十二) 資源規劃

1 硬件和軟件要求 1)硬件配置示例 硬件配置示例設備類型 設備型號 數量 備注 計算節點 CPU: 2*64 Cores,Kunpeng 920 內存:32*32GB 系統盤:2*960GB SATA SSD 數據盤:24*960GB SATA SSD RAID卡&#x…

Linux系統文件與目錄內容檢索(Day.2)

一、文件和目錄內容檢索處理命令1、uniq去重語法uniq [options] [input_file [output_file]]選項選項作用-c進行計數,并刪除文件中重復出現的行-d僅顯示連續的重復行-u僅顯示出現一次的行-i忽略大小寫案例1、刪除輸入文件中的重復行sort input.txt | uniq2、僅顯示重…

如何選擇一個容易被搜索引擎發現的域名?

在這個數字化時代,域名不僅是企業線上身份的標識,更是影響網站搜索曝光率的關鍵因素。一個精心挑選的域名能為品牌帶來更多自然流量,下面我們就來探討幾個實用技巧。一、簡潔易記是王道好域名首先要讓人過目不忘。想象一下,當用戶…

樹形DP進階:結合dfn序的線性化樹問題求解技巧

樹形DP進階:結合dfn序的線性化樹問題求解技巧一、dfn序與樹的線性化1.1 dfn序的基本概念1.2 樹形DP結合dfn序的優勢二、核心應用:子樹區間的DP優化2.1 子樹權值和的快速查詢與更新問題描述結合dfn序的解法代碼實現(前綴和版本)優化…