day35圖像處理OpenCV

一、圖像預處理

17 直方圖均衡化

  • 直方圖:反映圖像像素分布的統計圖,橫坐標就是圖像像素的取值,縱坐標是該像素的個數。也就是對一張圖像中不同像素值的像素個數的統計。
  • 增加對比度:黑的更黑,白的更白。

17.1繪制直方圖

就是以像素值為橫坐標,像素值的個數為縱坐標繪制一個統計圖。

  • 關鍵3步

  • hist=cv2.calcHist(images, channels, mask, histSize, ranges)

    • 作用

      • 統計像素出現的次數
    • 參數

      • images:輸入圖像列表,可以是一幅或多幅圖像(通常是灰度圖像或者彩色圖像的各個通道)。
      • channels:一個包含整數的列表,指示在每個圖像上計算直方圖的通道編號。如果輸入圖像是灰度圖,它的值就是 [0];如果是彩色圖像的話,傳入的參數可以是 [0],[1],[2] 它們分別對應著通道 B,G,R。
      • mask(可選):掩模,非黑色區域(目標區域)參與直方圖計算的區域;None為全部計算。
      • histSize:一個整數列表,也就是直方圖的區間個數(BIN 的數目)。用中括號括起來,例如:[256]
      • ranges:每維數據的取值范圍,它是一個二維列表,每一維對應一個通道的最小值和最大值,例如對灰度圖像可能是 [0, 256]
    • 返回值

      • hist: 是一個長度為255的數組,數組中的每個值表示圖像中對應灰度等級的像素計數
  • minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)

    • 參數:hist是上面的返回值數組

    • 返回值:

      • 獲取直方圖的最小值、最大值及其對應最小值的位置索引、最大值的位置索引
  • cv2.line(img, pt1, pt2, color, thickness)

    • img:原始圖像,即要在上面畫線的numpy數組(一般為uint8類型)。

    • pt1pt2:分別為線段的起點和終點坐標,它們都是元組類型

    • color:線段的顏色

    • thickness:線段的寬度,默認值是1

示例:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltdef draw():img = cv.imread('./images/lvbo.png')# 統計像素出現的次數hist = cv.calcHist(img, [0], None, [256], [0, 256])print(hist.shape)# 獲取最大和最小值的個數 和 索引(在hist數組中)minval, maxval, minloc, maxloc = cv.minMaxLoc(hist)# 創建全黑圖像,用于繪制直方圖hist_img = np.zeros([256, 256, 3], np.uint8)for i in range(256):# 除最大值:將所有出現的個數歸一化(0~1)# 乘0.9*255:將所有個數限制在 0~0.9*255 之間h = int(hist[i].item() / maxval * (0.9*256))cv.line(hist_img,(i, 256),(i, 256-h), (255, 255, 255), 1)cv.imshow('hist', hist_img)cv.waitKey(0)cv.destroyAllWindows()
draw()

17.2直方圖均衡化

一副效果好的圖像通常在直方圖上的分布比較均勻,直方圖均衡化就是用來改善圖像的全局亮度和對比度。

  • 直方圖均衡化作用:
    • 增強對比度
    • 提高圖像質量
1. 自適應直方圖均衡化

自適應直方圖均衡化(Adaptive Histogram Equalization, AHE),通過調整圖像像素值的分布,使得圖像的對比度和亮度得到改善。

  • 語法:
    • dst = cv.equalizeHist(imgGray)
  • 參數:灰度圖

imgGray為需要直方圖均衡化的灰度圖,返回值為處理后的圖像

優點:方法適用于圖像的灰度分布不均勻,且灰度分布集中在更窄的范圍,圖像的細節不夠清晰且對比度較低的情況。

缺點:會出現太亮的部分,會出現特征丟失

  • 示例
img = cv.imread('./images/lvbo.png')
img = cv.resize(img, (256, 256))
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
h = cv.equalizeHist(gray)
cv.imshow('gray', gray)
cv.imshow('h', h)
cv.waitKey(0)
cv.destroyAllWindows()
2. 對比度受限的自適應直方圖均衡化

很明顯,因為全局調整亮度和對比度的原因,臉部太亮,大部分細節都丟失了。自適應均衡化就是用來解決這一問題的:它在每一個小區域內(默認8×8)進行直方圖均衡化。當然,如果有噪點的話,噪點會被放大,需要對小區域內的對比度進行了限制,所以這個算法全稱叫:對比度受限的自適應直方圖均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)。

其主要步驟為:

  1. 圖像分塊(Tiling)
    • 圖像首先被劃分為多個不重疊的小塊(tiles)。這樣做的目的是因為在全局直方圖均衡化中,單一的直方圖無法反映圖像各個局部區域的差異性。通過局部處理,AHE能夠更好地適應圖像內部的不同光照和對比度特性。(tiles 的 大小默認是 8x8)
  2. 計算子區域直方圖
    • 對于每個小塊,獨立計算其內部像素的灰度直方圖。直方圖反映了該區域內像素值的分布情況。
  3. 子區域直方圖均衡化
    • 對每個小塊的直方圖執行直方圖均衡化操作。這涉及重新分配像素值,以便在整個小塊內更均勻地分布。均衡化過程會增加低頻像素的數量,減少高頻像素的數量,從而提高整個小塊的對比度。
  4. 對比度限制(Contrast Limiting)
    • 如果有噪聲的話,噪聲會被放大。為了防止過大的對比度增強導致噪聲放大,出現了限制對比度自適應直方圖均衡化(CLAHE)。CLAHE會在直方圖均衡化過程中引入一個對比度限制參數。當某一小塊的直方圖在均衡化后出現極端值時,會對直方圖進行平滑處理(使用線性或非線性的鉗制函數),確保對比度增強在一個合理的范圍內。
  5. 重采樣和鄰域像素融合
    • 由于小塊之間是不重疊的,直接拼接經過均衡化處理的小塊會產生明顯的邊界效應。因此,在CLAHE中通常采用重采樣技術來消除這種效應,比如通過雙線性插值將相鄰小塊的均衡化結果進行平滑過渡,使最終圖像看起來更為自然和平滑。
  6. 合成輸出圖像
    • 將所有小塊均衡化后的結果整合在一起,得到最終的自適應直方圖均衡化后的圖像。
  • 語法:

    • clahe = cv2.createCLAHE(clipLimit=None, tileGridSize=None)

      • clipLimit(可選):對比度限制參數,用于控制直方圖均衡化過程中對比度增強的程度。如果設置一個大于1的值(如2.0或4.0),CLAHE會限制對比度增強的最大程度,避免過度放大噪聲。如果不設置,OpenCV會使用一個默認值。

      • tileGridSize(可選):圖像分塊的大小,通常是一個包含兩個整數的元組,如(8, 8),表示將圖像劃分成8x8的小塊進行獨立的直方圖均衡化處理。分塊大小的選擇會影響到CLAHE的效果以及處理速度。

  • 創建CLAHE對象后,可以使用 .apply() 方法對圖像進行CLAHE處理:

    • img=clahe.apply(image)

      • image:要均衡化的圖像。

      • img均衡后的圖像

3. 示例
import cv2 as cv
import numpy as np
# 繪制直方圖的方法
def draw(img):# 統計像素出現的次數hist = cv.calcHist([img], [0], None, [256], [0, 256])# 獲取最大和最小值的個數 和 索引(在hist數組中)minval, maxval, minloc, maxloc = cv.minMaxLoc(hist)# 創建全黑圖像,用于繪制直方圖hist_img = np.zeros([256, 256, 3], np.uint8)for i in range(256):# 除最大值:將所有出現的個數歸一化(0~1)# 乘0.9*255:將所有個數限制在 0~0.9*255 之間h = int(hist[i].item() / maxval * (0.9 * 256))cv.line(hist_img, (i, 256), (i, 256 - h), (255, 255, 255), 1)return hist_img
# 均衡化的兩個方法
def draw3():img = cv.imread('./images/zhifang.png')gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 繪制灰度圖的直方圖hts_fray = draw(gray)# 普通的直方圖均衡化eqe = cv.equalizeHist(gray)hts_eqe = draw(eqe)# 繪制直方圖# 對比度受限的均衡化clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))img_clahe = clahe.apply(gray)hts_clahe = draw(img_clahe) # 繪制CLAHE后的直方圖cv.imshow('hts_fray', hts_fray)cv.imshow('hts_eqe', hts_eqe)cv.imshow('hts_clahe', hts_clahe)cv.waitKey(0)cv.destroyAllWindows()
draw3()
  • 輸出

在這里插入圖片描述

19 模板匹配

未完待續…

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

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

相關文章

【音視頻】FFmpeg內存模型

FFmpeg內存模型 從現有的Packet拷貝一個新Packet的時候,有兩種情況: 兩個Packet的buf引用的是同一數據緩存空間,這時候要注意數據緩存空間的釋放問題;兩個Packet的buf引用不同的數據緩存空間,每個Packet都有數據緩存…

1.2軟考系統架構設計師:系統架構的定義與作用 - 練習題附答案及超詳細解析

系統架構定義與作用綜合知識單選題 題目覆蓋核心概念、發展歷程、設計原則、評估標準及易混淆點,附答案解析: 1. 系統架構的標準定義源自于以下哪個標準? A. ISO/IEC 9126 B. IEEE 1471-2000 C. TOGAF 9.2 D. ITIL v4 答案:B 簡…

go語言對http協議的支持

http:無狀態協議,是互聯網中使用http使用http實現計算機和計算機之間的請求和響應 使用純文本方式發送和接受協議數據,不需要借助專門工具進行分析就知道協議中的數據 服務器端的幾個概念 Request:用戶請求的信息,用…

iscsi服務端安裝及配置

1. 安裝targetcli軟件包 yum install -y targetcli 2. 啟動target服務 systemctl start target systemctl enable target 3. 配置防火墻 firewall-cmd --add-port"3260/tcp" 3. 準備一個物理分區(或者邏輯分區)…

解決 MongoDB 查詢中的 `InvalidMongoDbApiUsageException` 錯誤

您在使用 Spring Data MongoDB 時遇到了 InvalidMongoDbApiUsageException 異常,錯誤信息如下: “由于 com.mongodb.BasicDocument 的限制,您無法添加第二個 ‘null’ 條件。查詢已經包含 ‘{ “KaTeX parse error: Expected }, got EOF at e…

一個關于相對速度的假想的故事-4

回到公式, 正寫速度疊加和倒寫速度疊加的倒寫相等,這就是這個表達式所要表達的意思。但倒寫疊加用的是減法,而正寫疊加用的是加法。當然是這樣,因為正寫疊加要的是單位時間上完成更遠的距離,而倒寫疊加說的是單位距離需…

重學React(一):描述UI

背景:React現在已經更新到19了,文檔地址也做了全面的更新,上一次系統性的學習還是在16-17的大版本更新。所以,現在就開始重新學習吧~ 學習內容: React官網教程:https://zh-hans.react.dev/lea…

AI大模型:(二)2.3 預訓練自己的模型

目錄 1.預訓練原理 2.預訓練范式 1.未標注數據 2.標注數據 3.有正確答案、也有錯誤答案 3.手撕transform模型 3.1.transform模型代碼 3.2.訓練數據集 3.3.預訓練 3.4.推理 4.如何選擇模型

gradle可用的下載地址(免費)

這幾天接手一個老項目,想找gradle老版本的,但一搜,雖然在CSDN上搜索出來一堆,但都是收費,有些甚至要幾十積分(吃相有點難看了)。 我找了一個能訪問的地址,特地分享出來,有需要的自取&#xff01…

vue3新增特性

一、Vue 3 新增特性 1. Composition API 概述: Composition API 提供了一種更靈活和強大的方式來組織和復用邏輯。適用于復雜組件和邏輯復用場景。主要功能: setup 函數:組件的入口點,用于定義響應式數據、方法、生命周期鉤子等。響應式 API:ref 和 reactive 提供更細粒度…

前端性能優化全攻略:JavaScript 優化、DOM 操作、內存管理、資源壓縮與合并、構建工具及性能監控

1 為什么需要性能優化? 1.1 性能優化的核心價值:用戶體驗與業務指標 性能優化不僅是技術層面的追求,更是直接影響用戶體驗和業務成敗的關鍵因素。 用戶體驗(UX): 響應速度:用戶期望頁面加載時…

【Unity筆記】Unity + OpenXR項目無法啟動SteamVR的排查與解決全指南

圖片為AI生成 一、前言 隨著Unity在XR領域全面轉向OpenXR標準,越來越多的開發者選擇使用OpenXR來構建跨平臺的VR應用。但在項目實際部署中發現:打包成的EXE程序無法正常啟動SteamVR,或者SteamVR未能識別到該應用。本文將以“Unity OpenXR …

Curl用法解析

Curl 用法解析 簡介 Curl 是一個強大的命令行工具,主要用于從服務器發送 HTTP 請求并獲取數據。它廣泛應用于調試 RESTful API、文件上傳下載、模擬用戶交互等多種場景。下面是一些基本用法及常見參數的分析: 基礎用法 curl [options] [URL]其中最基…

C語言教程(十一):C 語言中四種主要作用域及作用域嵌套遮蔽

一、引言 在 C 語言里,作用域指的是程序中變量、函數、類型等標識符能夠被使用的范圍。C 語言里有四種主要的作用域:塊作用域、函數作用域、文件作用域和原型作用域,下面為你展開介紹: 二、塊作用域 定義:塊作用域是 C…

初次嘗試Ghidra

最近看京東讀書上有本書叫《Ghidra權威指南》,竟然是美國國家安全局出品的逆向工具,我真是孤陋寡聞,第一次聽說。趕緊試試。 Release Ghidra 11.3.2 NationalSecurityAgency/ghidra GitHub 最新版本竟然是上周發布的,看來很活…

樂視系列玩機---樂視2 x620 x628等系列線刷救磚以及刷寫第三方twrp 卡刷第三方固件步驟解析

樂視2 x620 x628 x626等,搭載了Helio X20處理器,mtk6797芯片。 通過博文了解?????? 1??????-----詳細解析樂視2 x620系列黑磚線刷救磚的步驟 2??????----官方兩種更新卡刷步驟以及刷寫第三方twrp過程與資源 3??????----樂視2 mtk系列機型救磚 刷…

web原生API AbortController網絡請求取消方法使用介紹:防止按鈕重復點擊提交得最佳方案

在前端開發中,取消網絡請求是一個常見的需求,尤其是在用戶頻繁操作或需要中斷長時間請求的場景下。 AbortController 主要用于 ?優雅地管理和取消異步操作: 瀏覽器原生 API 一、代碼解析 1. ?創建 AbortController 實例 const controlle…

2025智能駕駛趨勢評估

以下是對2025年智能駕駛趨勢的評估: 技術發展 ? 自動駕駛級別提升:2025年有望成為L3級自動駕駛的商用元年。L3級自動駕駛技術開始從高端車型向20萬元以下價格帶下沉,部分車企如江淮和華為合作的尊界S800、小鵬汽車等都在積極推進L3級自動駕駛…

Spring MVC DispatcherServlet 的作用是什么? 它在整個請求處理流程中扮演了什么角色?為什么它是核心?

DispatcherServlet 是 Spring MVC 框架的絕對核心和靈魂。它扮演著前端控制器(Front Controller)的角色,是所有進入 Spring MVC 應用程序的 HTTP 請求的統一入口點和中央調度樞紐。 一、 DispatcherServlet 的核心作用和職責: 請…

Linux 內核中 cgroup 子系統 cpuset 是什么?

cpuset 是 Linux 內核中 cgroup(控制組) 的一個子系統,用于將一組進程(或任務)綁定到特定的 CPU 核心和 內存節點(NUMA 節點)上運行。它通過限制進程的 CPU 和內存資源的使用范圍,優…