opencv之圖像亮度變換和形態學變換(八)

opencv之圖像亮度變換和形態學變換(八)

文章目錄

  • opencv之圖像亮度變換和形態學變換(八)
  • 一、圖像亮度變換
    • 1.1 亮度變換
    • 1.2 線性變換
    • 1.3 直接像素值修改
    • 案例
  • 二、形態學變換
    • 2.1 核
    • **2.2 腐蝕(Erosion)**
    • **2.3 膨脹(Dilation)**
    • **2.4 開運算(Opening)**
    • **2.5 閉運算(Closing)**
    • **2.6 禮帽運算(Top Hat)**
    • **2.7 黑帽運算(Black Hat)**
    • **2.8 形態學梯度(Morphological Gradient)**
    • **核心總結**
    • 案例


一、圖像亮度變換

1.1 亮度變換

在講解亮度時,需要和對比度一起來進行解釋。

對比度調整:圖像暗處像素強度變低,圖像亮處像素強度變高,從而拉大中間某個區域范圍的顯示精度。

亮度調整:圖像像素強度整體變高或者變低。

在這里插入圖片描述
上圖中,(a)把亮度調高,就是圖片中的所有像素值加上了一個固定值;(b)把亮度調低,就是圖片中的所有像素值減去了一個固定值;?增大像素對比度(白的地方更白,黑的地方更黑);(d)減小像素對比度(整幅圖都趨于一個顏色);

OpenCV調整圖像對比度和亮度時,公式為: g ( i , j ) = α f ( i , j ) + β g(i,j)=\alpha f(i,j)+\beta g(i,j)=αf(i,j)+β。但是不能淺顯的講 α \alpha α是控制對比度, β \beta β是控制亮度的。

對比度:需要通過 α 、 β \alpha、\beta αβ一起控制。

亮度:通過 β \beta β控制。

1.2 線性變換

使用 cv2.addWeighted() 函數,可以對圖像的像素值進行加權平均,進而改變圖像的整體亮度。亮度增益可以通過向每個像素值添加一個正值來實現。

cv2.addWeighted(src1, alpha, src2, beta, gamma)

  • src1:第一張輸入圖像,它將被賦予權重 alpha

  • alpha:第一個輸入圖像的權重。

  • src2:第二張輸入圖像,它將被賦予權重 beta

  • beta:第二個輸入圖像的權重。

  • gamma:一個標量,將被添加到權重求和的結果上,可用于調整總體亮度。

    計算公式為: dst = src1 * alpha + src2 * beta + gamma

1.3 直接像素值修改

如果只需要增加或減少固定的亮度值,可以直接遍歷圖像像素并對每個像素值進行加減操作。

使用的API:

numpy.clip(a, a_min, a_max)

用于對數組中的元素進行限定,將超出指定范圍的元素值截斷至指定的最小值和最大值之間

  • a:輸入數組。

  • a_min:指定的最小值,數組中所有小于 a_min 的元素將被替換為 a_min

  • a_max:指定的最大值,數組中所有大于 a_max 的元素將被替換為 a_max

案例

案例一

import numpy as np
import cv2 as cvimg = cv.imread("images/1.jpg")
# 使用cv2.addWeihted(src1, alpha, src2, beta, gamma)實現線性變換
"""
np.zeros_like(img) 生成與img相同形狀的零矩陣
np.ones_like(img) 生成與img相同形狀的1矩陣
np.full_like(img, n) 生成與img相同形狀的n矩陣
"""
dst = cv.addWeighted(img, 1, np.zeros_like(img), 0, 50)cv.imshow("dst", dst)
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyAllWindows()

在這里插入圖片描述

案例二

import cv2 as cv
import numpy as npwindow_name = 'Trackbar'
cv.namedWindow(window_name)# 寫一個改變圖像亮度的方法
def change(p):img = cv.imread('images/1.jpg')if img is None:print("圖像加載失敗,請檢查路徑!")return# 把滑條范圍映射到-255~255p = int(p)  # 確保 p 是整數p = p / 255 * (255 - (-255)) - 255# 亮度變換dst = np.uint8(img + p)dst = np.clip(dst, 0, 255)cv.imshow(window_name, dst)# 創建滑條
cv.createTrackbar('p', 'Trackbar', 0, 255, change)# 初始化顯示
change(0)  # 初始化時調用一次,確保圖像顯示cv.waitKey(0)
cv.destroyAllWindows()

在這里插入圖片描述

二、形態學變換

形態學變換(Morphological Transformations)是一種基于形狀的簡單變換,它的處理對象通常是二值化圖像。形態學變換有兩個輸入,一個輸出:輸入為原圖像、核(結構化元素),輸出為形態學變換后的圖像。其基本操作有腐蝕和膨脹,這兩種操作是相反的,即較亮的像素會被腐蝕和膨脹。下面我們來說一下核、腐蝕與膨脹的概念。

2.1 核

自適應二值化中,我們已經接觸過核了,還記得嗎?就是那個在原圖中不斷滑動計算的3*3的小區域,那其實就是一個3*3的核。

核(kernel)其實就是一個小區域,通常為3*3、5*5、7*7大小,有著其自己的結構,比如矩形結構、橢圓結構、十字形結構,如下圖所示。通過不同的結構可以對不同特征的圖像進行形態學操作的處理。
在這里插入圖片描述

2.2 腐蝕(Erosion)

  • 作用:收縮白色區域(前景),消除小噪點、細線
  • 原理:結構元素覆蓋區域內有黑即黑(取最小值)
  • 效果:目標"變瘦",邊緣平滑

2.3 膨脹(Dilation)

  • 作用:擴展白色區域,填補空洞、斷裂
  • 原理:結構元素覆蓋區域內有白即白(取最大值)
  • 效果:目標"變胖",輪廓連通

2.4 開運算(Opening)

  • 操作:先腐蝕后膨脹
  • 作用:消除孤立噪點、分離粘連物體
  • 特點:保留原主體,去除小干擾

2.5 閉運算(Closing)

  • 操作:先膨脹后腐蝕
  • 作用:填充內部孔洞、閉合縫隙
  • 特點:平滑輪廓,保持主體完整性

2.6 禮帽運算(Top Hat)

  • 公式:原圖 - 開運算結果
  • 作用:提取比背景亮的細節(如微小亮斑)
  • 應用:背景均勻時的前景增強

2.7 黑帽運算(Black Hat)

  • 公式:閉運算結果 - 原圖
  • 作用:提取比背景暗的細節(如暗色缺陷)
  • 應用:檢測深色區域或空洞

2.8 形態學梯度(Morphological Gradient)

  • 公式:膨脹圖 - 腐蝕圖
  • 作用:突出邊緣輪廓
  • 效果:類似邊緣檢測,但更平滑

核心總結

操作關鍵作用典型應用場景
腐蝕消除噪點、細化物體去除胡椒噪聲
膨脹連接斷裂、填充孔洞文字修復
開運算去噪+保形分離粘連細胞
閉運算補洞+平滑填充指紋斷裂
禮帽提取亮細節顯微圖像亮斑提取
黑帽提取暗細節工業缺陷檢測
形態學梯度邊緣增強目標輪廓提取

:所有操作均依賴**結構元素(核)**的形狀和大小選擇!

案例

案例一:腐蝕和膨脹

import cv2 as cv
import numpy as nplong = cv.imread("images/long.png")
# 定義一個5×5的卷積核
kernel = np.ones((5,5),np.uint8)
# 腐蝕操作cv.erode(src, kernel, dst, anchor, iterations, borderType, borderValue)
# iterations表示迭代次數
dst_erode = cv.erode(long,kernel,iterations=1)# 膨脹操作cv.dilate(src, kernel, dst, anchor, iterations, borderType, borderValue)
dst_dilate = cv.dilate(long,kernel,iterations=5)cv.imshow("long",long)
cv.imshow("dst_erode",dst_erode)
cv.imshow("dst_dilate",dst_dilate)
cv.waitKey(0)
cv.destroyAllWindows()

在這里插入圖片描述

案例二

import cv2 as cv
import numpy as npcar = cv.imread("images/car4.png")
car = cv.resize(car,(640,480))
# 定義一個5×5的卷積核
kernel = np.ones((5,5),np.uint8)
# 開運算 cv.morphologyEx(src,op,kernel) # 先腐蝕再膨脹
open = cv.morphologyEx(car,cv.MORPH_OPEN,kernel)
# 閉運算 cv.morphologyEx(src,op,kernel) # 先膨脹再腐蝕
close = cv.morphologyEx(car,cv.MORPH_CLOSE,kernel)# 顯示圖像
cv.imshow("car",car)
cv.imshow("open",open)
cv.imshow("close",close)
cv.waitKey(0)
cv.destroyAllWindows()

在這里插入圖片描述

案例三

import cv2 as cv
import numpy as npcar = cv.imread("images/car4.png")
car = cv.resize(car,(640,480))
# 定義一個5×5的卷積核
kernel = np.ones((5,5),np.uint8)
# 禮帽運算cv.morphologyEx(src,op,kernel) 原圖減"開運算"
dst_top = cv.morphologyEx(car,cv.MORPH_TOPHAT,kernel)# 黑帽運算cv.morphologyEx(src,op,kernel) "閉運算"的結果圖與原圖像之差
dst_black = cv.morphologyEx(car,cv.MORPH_BLACKHAT,kernel)cv.imshow("car",car)
cv.imshow("dst_top",dst_top)
cv.imshow("dst_black",dst_black)
cv.waitKey(0)
cv.destroyAllWindows()

在這里插入圖片描述

案例四

import cv2 as cv
import numpy as npcar = cv.imread("images/car4.png")
car = cv.resize(car,(640,480))
# 定義一個5×5的卷積核
kernel = np.ones((5,5),np.uint8)
# 形態學梯度 cv2.morphologyEx(src,op,kernel) 像素點在膨脹后的圖像值與其在腐蝕后的圖像值之差
gradient = cv.morphologyEx(car,cv.MORPH_GRADIENT,kernel)
cv.imshow("gradient",gradient)
cv.imshow("car",car)
cv.waitKey(0)
cv.destroyAllWindows()

在這里插入圖片描述

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

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

相關文章

【初階數據結構】樹——二叉樹——堆(中)

文章目錄 前言 一、堆的概念與結構 二、堆的實現 堆的定義 1.初始化堆 2.堆的銷毀 3.堆的插入 3.1向上調整算法 4.堆的判空 5.求有效個數 6.刪除堆頂數據 6.1向下調整算法 7.獲取棧頂數據 三、完整源碼 總結 前言 上篇了解樹和二叉樹相關的概念,這篇學習一種特殊的…

AM剪輯軟件漢化版:簡單易用,開啟視頻創作之旅

在短視頻流量時代,視頻剪輯已經成為許多人表達自我和記錄生活的重要方式。無論是分享日常點滴、制作創意視頻還是進行專業內容創作,一款功能強大且操作簡便的視頻剪輯軟件是必不可少的。今天,我們要介紹的 AM剪輯軟件漢化版,就是這…

llfc項目分布式服務筆記

一、系統整體架構流程圖(簡明版) 復制代碼 +---------------+ +------------------+ +----------------+ | 客戶端 (Client) |--------->| GateServer |----------| StatusServer |<--+ +---------------+ +--------------…

C++如何設計和實現緩存(cache)來減少對后端存儲的訪問壓力

隨著數據量的激增和用戶對低延遲、高吞吐量需求的不斷提升,如何減少系統瓶頸、提升響應速度成為了開發者的核心挑戰之一。在這一背景下,緩存(cache)作為一種關鍵的技術手段,逐漸成為解決性能問題的核心策略。緩存的本質是通過存儲頻繁訪問的數據或計算結果,減少對后端存儲…

華為設備端口隔離

端口隔離的理論與配置指南 一、端口隔離的理論 基本概念 端口隔離&#xff08;Port Isolation&#xff09;是一種在交換機上實現的安全功能&#xff0c;用于限制同一VLAN內指定端口間的二層通信。被隔離的端口之間無法直接通信&#xff0c;但可通過上行端口訪問公共資源&#…

1688平臺商品詳情接口開發指南(含Python代碼示例)

接口概述 1688開放平臺提供的商品詳情接口&#xff08;item_get&#xff09;是獲取商品核心數據的重要API&#xff0c;開發者可通過該接口獲取商品標題、價格、規格參數、圖片等詳細信息。本文重點解析標題字段的獲取方式&#xff0c;并提供完整代碼示例。 接口請求參數 基礎…

Edge瀏覽器PDF字體顯示錯誤

Edge瀏覽器PDF字體顯示錯誤 軟件版本信息 Edge Version: 136.0.3240.50 Word Version: Microsoft Office 專業增強版2021問題描述 在Word中使用多級列表自動編號, 并使用Word軟件自帶的導出為PDF文件功能, 在Word中顯示正常的數字, 在Edge中查看PDF將會出現渲染錯誤的現象,…

Redis能保證數據不丟失嗎之AOF

我們都知道,Redis是一個基于內存的k-v數據庫,既然是基于內存的,那么Redis如何保證數據不丟失?以及真的能做到數據的百分百不丟失嗎? 為什么Redis數據需要持久化機制? Redis的一個常用場景是緩存,通常緩存丟失的話,我們也可以從數據庫中重新找回,那么為什么Redis還需…

Apache POI實現Excel的基本寫入、導出操作

目錄 一、Apache POI 簡介 二、入門案例(寫入導出) 三、實際開發過程中的導出操作——&#xff08;將文件下載至客戶端瀏覽器中&#xff09; 一、Apache POI 簡介 Apache POI&#xff08;Poor Obfuscation Implementation&#xff09;是 Apache 軟件基金會的開源項目&#…

HTTP請求與前端資源未優化的系統性風險與高性能優化方案

目錄 前言一、未合并靜態資源&#xff1a;HTTP請求的隱形殺手1.1 多文件拆分的代價1.2 合并策略與工具鏈實踐 二、未啟用GZIP壓縮&#xff1a;傳輸流量的浪費2.1 文本資源的壓縮潛力2.2 服務端配置與壓縮算法選擇 三、未配置瀏覽器緩存&#xff1a;重復請求的根源3.1 緩存失效的…

AgentMesh開源多智能體 (Multi-Agent) 平臺

AgentMesh 是一個開源的多智能體 (Multi-Agent) 平臺&#xff0c;核心目標是解決多個智能體之間的通信和協同問題&#xff0c;真正實現 “11>2” 的效果。能夠幫助用戶快速創造自己的多智能體團隊&#xff0c;或是讓已有的多個單一智能體獲得協同能力&#xff0c;最終解決更…

基于Jetson Nano與PyTorch的無人機實時目標跟蹤系統搭建指南

引言&#xff1a;邊緣計算賦能智能監控 在AIoT時代&#xff0c;將深度學習模型部署到嵌入式設備已成為行業剛需。本文將手把手指導讀者在NVIDIA Jetson Nano&#xff08;4GB版本&#xff09;開發板上&#xff0c;構建基于YOLOv5SORT算法的實時目標跟蹤系統&#xff0c;集成無人…

從入門到登峰-嵌入式Tracker定位算法全景之旅 Part 8 |產品化與運維:批量標定、誤差監控、OTA 升級與安全防護

Part 8 |產品化與運維:批量標定、誤差監控、OTA 升級與安全防護 本章聚焦將嵌入式 Tracker 定位系統推向 量產與運維 階段,覆蓋 批量標定、誤差監控、遠程 OTA 升級 以及 定位安全防護,確保產品在大規模部署后仍能穩定、精準、可靠地運行。 一、批量標定平臺搭建 標定流程…

gsplat 渲染庫 安裝部署筆記

目錄 Windows 安裝 Nvdiffrast安裝 gsplat安裝成功筆記: cu118測試ok vs 編譯安裝報錯: 安裝命令: 報錯結果: Windows 安裝 pip install gsplat 安裝成功,調用報錯: python -c "from gsplat import csrc as _C" Traceback (most recent call last): …

Java二維碼學習

使用Java語言生成二維碼有以下方式,一是谷歌的zxing,二是基于zxing實現的qrcode開源項目,三是基于zxing實現的qrgen開源項目 一 zxing 谷歌的zxing技術生成二維碼,是MultiFormatWriter多寫格式書寫器生成BitMatrix位矩陣,然后將位矩陣的信息在BufferedImage中設置二維碼…

工業質檢/缺陷檢測領域最新頂會期刊論文收集整理 | AAAI 2025【持續更新中】

會議官方論文列表&#xff1a;https://ojs.aaai.org/index.php/AAAI/issue/view/624 其中&#xff0c;2025年是第三十九屆AAAI人工智能大會&#xff0c;主要對第三十九屆相關論文進行梳理&#xff0c;當前已初版28期(volume 39 no. 28) 【Attention】 雖然本文主要面向的領域…

數據結構實驗8.1:圖的基本操作

文章目錄 一&#xff0c;實驗目的二&#xff0c;實驗內容三&#xff0c;實驗要求四&#xff0c;算法分析五&#xff0c;示例代碼8-1.cpp源碼graph.h源碼 六&#xff0c;操作步驟七&#xff0c;運行結果 一&#xff0c;實驗目的 1&#xff0e;掌握圖的鄰接矩陣、鄰接表的表示方…

Spring Boot3 實現定時任務 每10分鐘執行一次,同時要解決分布式的問題 區分不同場景

在Spring Boot 3中實現分布式定時任務&#xff0c;確保多實例環境下任務僅執行一次&#xff0c;可以采用以下方案&#xff1a; 方案一&#xff1a;Redis分布式鎖&#xff08;推薦&#xff09; import org.springframework.data.redis.core.StringRedisTemplate; import org.sp…

WPF MVVM入門系列教程(五、命令和用戶輸入)

&#x1f9ed; WPF MVVM入門系列教程 一、MVVM模式介紹二、依賴屬性三、數據綁定四、ViewModel五、命令和用戶輸入六、ViewModel案例演示 WPF中的命令模型 在WPF中&#xff0c;我們可以使用事件來響應鼠標和鍵盤動作。 但使用事件會具備一定的局限性&#xff0c;例如&#x…

2025年01月09日德美醫療前端面試

目錄 vue2 的雙向綁定的原理vue3 的雙向綁定原理vue 的生命周期vue 子組件為何不能修改父組件的值js delete 刪除數組的某一個值會怎么樣vue 和 react 的 diff 算法什么是閉包原型鏈this指向 vue2 的雙向綁定的原理 以下是 Vue 2 雙向綁定的原理&#xff1a; 1. 核心概念 …