OpenCv(二)——邊界填充、閾值處理

目錄

一、邊界填充(Border Padding)

1. 常見填充類型及效果

2.代碼示例

(1)constant邊界填充,填充指定寬度的像素

(2)REFLECT鏡像邊界填充

(3)REFLECT_101鏡像邊界填充改進

(4)?REPLICATE使用最邊界的像素值代替

?(5)WRAP上下左右邊依次替換

二、閾值處理

1. 常見閾值類型

2. 代碼示例

3.結果分析與參數調整技巧


在 OpenCV 圖像處理中,邊界填充和閾值處理是基礎且常用的操作。邊界填充用于擴展圖像邊緣,閾值處理則通過設定閾值將圖像轉化為二值圖像,便于后續分析。下面詳細介紹這兩項技術。

一、邊界填充(Border Padding)

邊界填充指在圖像邊緣添加像素,常用于卷積操作、圖像拼接等場景,避免邊緣信息丟失。OpenCV 通過cv2.copyMakeBorder()實現,語法如下:

cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value)
  • src:輸入圖像
  • top/bottom/left/right:上下左右填充的像素數
  • borderType:填充類型(核心參數)
  • value:當borderType=cv2.BORDER_CONSTANT時的填充值

1. 常見填充類型及效果

2.代碼示例

(1)constant邊界填充,填充指定寬度的像素


import cv2ys = cv2.imread('a.png')  # 讀取原圖,每個邊界填充都需要在原圖的基礎上完成,所以在使用時要先讀取原圖,把原圖作為參數傳入下面的方法中
ys = cv2.resize(ys,(300,300))  # 圖片縮放
top, bottom, left, right = 50, 50, 50, 50
constant = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=(229, 25, 80))
cv2.imshow('yuantu', ys)
cv2.waitKey(0)
cv2.imshow('CONSTANT', constant)
cv2.waitKey(0)

運行效果如下:

    (2)REFLECT鏡像邊界填充

    原圖代碼與上述相同不再展示,只展示變化部分

    reflect = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
    cv2.imshow('REFLECT', reflect)
    cv2.waitKey(0)

    運行效果:

    (3)REFLECT_101鏡像邊界填充改進

    reflect101 = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
    cv2.imshow('REFLECT_101', reflect101)
    cv2.waitKey(0)

    效果:

    (4)?REPLICATE使用最邊界的像素值代替

    replicate = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
    cv2.imshow('REPLICATE', replicate)
    cv2.waitKey(0)

    效果:

    ?(5)WRAP上下左右邊依次替換

    wrap = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
    cv2.imshow('WRAP', wrap)
    cv2.waitKey(0)

    效果:

    邊界填充是 OpenCV 圖像處理中的基礎操作,掌握不同填充方式的特點和適用場景,有助于提升后續圖像處理(如卷積、特征提取)的效果。本文介紹的 5 種填充方式各有優劣,實際使用時需結合具體業務場景靈活選擇。

    二、閾值處理

    閾值處理是將灰度圖像轉化為二值圖像的過程:通過設定閾值thresh,將像素值大于thresh的設為一個值(如 255),小于的設為另一個值(如 0)。OpenCV 中cv2.threshold()是核心函數:

    ret, dst = cv2.threshold(src, thresh, maxval, type)
    • src:輸入圖像(需為單通道灰度圖)
    • thresh:閾值(如 127)
    • maxval:最大值(當像素超過閾值時賦予的值)
    • type:閾值類型(核心參數)
    • ret:返回的閾值(與輸入 thresh 一致)
    • dst:處理后的圖像

    1. 常見閾值類型

    圖像通道及表示知識補充:

    一張灰色圖片上有許許多多的像素塊,每個像素塊都有一個數值,這個數值的取值范圍時[0 ~ 255],數值越小顏色越暗越黑,數值越大顏色越亮表現為越白。

    彩色圖片則有三個通道RGB,針對每一個通道都有一個對應的值,以上面介紹邊界填充的value為例,value=(229,25,80),需要注意,在opencv中通道的順序為BGR,也就是B=229,G=25,R=80.分別是英文的縮寫,藍色(blue)綠色(green)紅色(red).

    上面的閾值也是指一個在0~255之間的值。

    2. 代碼示例

    1.二進制閾值處理

    import cv2# 讀取圖像并調整大小
    img = cv2.imread('a.png')
    img = cv2.resize(img, (400, 400))# 二進制閾值處理: 像素值 > 175 設為255,否則設為0
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_BINARY)# 顯示原圖和處理結果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('binary', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    效果如下:

    2.反二進制閾值處理

    import cv2# 讀取圖像并調整大小
    img = cv2.imread('a.png')
    img = cv2.resize(img, (400, 400))# 反二進制閾值處理: 像素值 > 175 設為0,否則設為255
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_BINARY_INV)# 顯示原圖和處理結果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('binary_inv', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    效果如下:

    3.零閾值處理

    import cv2# 讀取圖像并調整大小
    img = cv2.imread('a.png')
    img = cv2.resize(img, (400, 400))# 零閾值處理: 像素值 > 175 保持原值,否則設為0
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_TOZERO)# 顯示原圖和處理結果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('tozero', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    效果如下:

    4.反零閾值處理

    
    import cv2# 讀取圖像并調整大小
    img = cv2.imread('a.png')
    img = cv2.resize(img, (400, 400))# 反零閾值處理: 像素值 > 175 設為0,否則保持原值
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_TOZERO_INV)# 顯示原圖和處理結果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('tozero_inv', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    效果如下:

    5.截斷閾值處理

    import cv2# 讀取圖像并調整大小
    img = cv2.imread('input.png')
    img = cv2.resize(img, (400, 400))# 截斷閾值處理: 像素值 > 175 設為175,否則保持原值
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_TRUNC)# 顯示原圖和處理結果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('trunc', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    效果如下:

    3.結果分析與參數調整技巧

    1. 閾值選擇的影響

      • 閾值過高(如 180):可能丟失目標細節,暗區域過大
      • 閾值過低(如 50):可能保留過多噪聲,目標與背景混淆
      • 建議:通過觀察圖像直方圖(cv2.calcHist())確定合適閾值
    2. 彩色圖 vs 灰度圖

      • 直接對彩色圖處理時,閾值會分別作用于 B、G、R 三個通道,可能導致顏色失真
      • 推薦先轉為灰度圖(cv2.COLOR_BGR2GRAY),再進行閾值處理,效果更穩定

    ? ? ?3.適用場景總結

    閾值處理是圖像處理中的基礎工具,掌握 5 種常用閾值類型的特點和適用場景,能幫助我們快速簡化圖像、突出目標。實際應用中,需根據圖像特點(如光照、對比度)選擇合適的閾值類型和參數,必要時結合自適應閾值提升效果。

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

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

    相關文章

    Leetcode 15 java

    今天復習一下翻轉二叉樹 226. 翻轉二叉樹 給你一棵二叉樹的根節點 root ,翻轉這棵二叉樹,并返回其根節點。 示例 1: 輸入:root [4,2,7,1,3,6,9] 輸出:[4,7,2,9,6,3,1]示例 2: 輸入:root [2…

    嵌入式學習的第四十九天-時鐘+EPIT+GPT定時器

    一、時鐘1.時鐘系統基本概念(1)PLL (鎖相環, Phase-Locked Loop)作用:PLL是一種反饋控制電路,用于生成穩定的高頻時鐘信號。它通過將輸出時鐘與參考時鐘進行比較和調整,可以產生比輸入參考時鐘頻率高得多的輸出時鐘。倍…

    Python Sqlalchemy數據庫連接

    Python Sqlalchemy數據庫連接一、連接數據二、模型三、ORM操作一、連接數據 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker# 1. 連接數據庫 dbHost postgres://用戶名:密碼主機:端口/數據庫名 engine create_engine(dbHost) # create_engi…

    【Node.js】ECMAScript標準 以及 npm安裝

    目錄 一、 ECMAScript標準 - 默認導出和導入 二、ECMAScript標準 - 命名導出和導入 三、包的概念 五、 npm - 安裝所有依賴 六、 npm - 全局軟件包 Node.js總結 總結不易~ 本章節對我有很大的收獲, 希望對你也是!!! 本節素材…

    NPM 、 NPX

    NPM vs. NPX 簡單來說,npm 是一個 node 包管理器,npx 是一個 Node 包執行器。 NPX 是一個 Node 包執行器,該 Node 包可以是本地也可以是遠程的。允許開發者在無需安裝的情況下執行任意 Node 包。npm 在安裝nodejs 就自動帶了 npm install -g …

    守護品質安全,防偽溯源系統打造全鏈路信任體系

    一、引言在當下這個信息透明、品質至上的時代,防偽溯源已經成為眾多品牌保護自身利益、提升消費者信任度的重要手段。為了滿足市場上對高效、可靠的防偽溯源查詢系統的迫切需求,榕壹云精心打造了一款防偽溯源查詢系統。二、項目背景隨著商品市場的不斷擴…

    【完整源碼+數據集+部署教程】無人機航拍視角洪水檢測與受災房屋識別圖像分割救援指導系統源碼和數據集:改進yolo11-DCNV2

    背景意義 研究背景與意義 隨著全球氣候變化的加劇,極端天氣事件的頻率和強度不斷上升,洪水作為一種常見的自然災害,給人類社會帶來了嚴重的威脅。洪水不僅導致人員傷亡和財產損失,還對基礎設施和生態環境造成了深遠的影響。因此&a…

    C# 結構體與類的區別是什么?

    結構體是值類型是儲存在棧中獨立儲存的,數據與數據之間不會相互影響,即使將一個結構體賦值給另外一個結構體也不會相互影響。 類是一個模板,實例出來的對象是獨立的不會相互影響,但是將一個對象賦值給另一個對象時 會把指向堆內存中數據的指針賦值給另一個對象.從而發生兩個變量…

    Redis GEO

    Redis GEO 引言 Redis 是一款高性能的鍵值存儲系統,廣泛應用于緩存、消息隊列等領域。Redis GEO 是 Redis 2.4 版本后新增的一個功能,用于存儲地理位置信息。本文將詳細介紹 Redis GEO 的概念、使用方法以及應用場景。 什么是 Redis GEO? Redis GEO 是 Redis 的一個模塊…

    Go從入門到精通系列學習路線規劃

    Go從入門到精通系列學習路線規劃 目錄導航 Go從入門到精通系列學習路線規劃首頁說明 第1篇_Go語言初探_環境搭建與HelloWorld 第2篇_Go語言基礎語法_變量常量與數據類型 第3篇_Go語言控制結構_條件判斷與循環 第4篇_Go語言函數詳解 第5篇_Go語言數據結構詳解 第6篇_Go語言結構體…

    Grid系統概述

    目錄 概念及功能 網格對象(Grid Object) 和世界對象(World Object) 工作流程 概念及功能 TrinityCore 的 Grid 系統是一套復雜的地圖分區管理機制,其核心目標是通過動態管控游戲世界的區域狀態和對象生命周期&#…

    一文搞懂LLM大模型!LLM從入門到精通萬字長文(2024.12月最新)

    LLM從入門到精通精品文章 目錄 一、LLM基本概念 二、LLM發展歷程 三、LLM大模型的分類 四、LLM主流大模型類別 五、LLM大模型建立的流程 六、Fine-Tuning 七、Prompt-Tuning 八、超大規模參數模型Prompt-Tuning方法 8.1上下文學習 In-Context Learning 8.2.指令學習 …

    Next.js跟React關系(Next.js是基于React庫的全棧框架)(文件系統路由、服務端渲染SSR、靜態生成SSG、增量靜態再生ISR、API路由)

    文章目錄**1. React 是基礎,Next.js 是擴展****2. Next.js 解決了 React 的哪些痛點?****3. 核心區別****4. Next.js 的核心特性**1. **文件系統路由**2. **服務端渲染(SSR)**3. **靜態生成(SSG)**4. **增量…

    Nightingale源碼Linux進行跨平臺編譯

    最近使用Nightingale 需要實現對服務的監測,想要在Windows 系統中使用,看官方文檔中并不直接提供執行程序,原文如下: 準備工作 本地環境 本地已經安裝git 本地安裝git 便于后續下載源碼并進行自動編譯。 Linux操作系統環境&…

    抽絲剝繭丨PostgreSQL 系國產數據庫%SYS CPU newfstatat() high 調優一例(二)

    續接上回《PostgreSQL 系國產數據庫%SYS CPU newfstatat() high 調優一例(一)》,這個問題還在持續,并且原因并不只是一個,從調了文件系統級atime,到調整wal size減少日志被動清理,還有在驗證tem…

    【新手入門】Android Studio 項目結構拆解,快速理解文件作用!

    目 錄 一、【Project】視圖下項目結構(真實目錄) 二、【Android】視圖下項目結構 三、【app/】下重要文件解析 1、 build.gradle 2、AndroidManifest.xml 3、res/ 作為剛剛接觸Android開發的小白,使用Android Studio創建項目后&…

    Python實現點云Kmeans、歐式和DBSCAN聚類

    本節我們分享點云處理中的三種常見聚類方法,分別是K-means、歐氏與 DBSCAN聚類。具體介紹如下:1. K-means 聚類定義:一種基于距離度量的無監督學習算法,將數據劃分為 K 個緊湊的簇,使簇內數據相似度高、簇間差異大。算…

    【Java后端】MyBatis-Plus 原理解析

    MyBatis-Plus 原理解析 其實 MyBatis-Plus 的 Service 層設計就是為了讓開發者不用重復寫很多樣板代碼。我們來一點點剖析 UserServiceImpl、IService、UserService、ServiceImpl 之間的關系和調用鏈。1. 類/接口關系圖IService<T>▲│UserService (接口) <-- 自定義…

    Nacos 注冊中心學習筆記

    &#x1f389; Alibaba微服務組件 Nacos 注冊中心超詳細學習筆記 &#x1f389; &#x1f4cc; 寫在前面&#xff1a;本文基于官方PDF文檔與實戰經驗&#xff0c;整理了Nacos注冊中心的核心知識點、部署流程與實戰技巧&#xff0c;力求圖文并茂、通俗易懂&#xff0c;適合收藏反…

    java 策略模式 demo

    策略模式介紹策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一系列算法&#xff0c;將每個算法封裝起來并使它們可相互替換。策略模式讓算法的變化獨立于使用算法的客戶端&#xff0c;從而實現靈活的算法切換。核心角色&#xff1…