【基于OpenCV的圖像處理】圖像預處理之圖像色彩空間轉換以及圖像灰度化處理

目錄

零、寫在前面的話

一、圖像色彩空間轉換

1.1 RGB顏色空間

1.1.1 RGB顏色空間概念

1.1.2 RGB顏色模型?編輯

1.1.3 關于顏色加法

1.1.4 顏色加權加法

1.2 HSV顏色空間

1.2.1 HSV顏色空間概念

1.2.2 HSV顏色模型

1.2.3 應用意義

1.3 顏色轉換

1.3.1 轉換方法

1.3.2?RGB轉Gray, RGB轉HSV

二、圖像灰度化處理

2.1 概念基礎

2.1.1 灰度圖

2.1.2 轉化為彩色圖

2.1.3 兩個極端的灰度值

2.2 灰度化處理方法

2.2.1 最大值法

2.2.2 平均值法

2.2.3 加權均值法


零、寫在前面的話

????????在這個階段的學習里,初學者們應該持著正確的學習心態,注重基礎操作、多敲代碼;遇到搞不懂的原理和難題可以先跳過,先把基礎概念以及方法的使用弄明白,待度過“黑盒階段”后再補理論也是可以的。還有一點,要善用社區資源,可以多看技術文檔與相關文章。

????????學習圖像處理道阻且艱,都說圖像預處理是“臟活累活”,但其直接影響后續高級任務的性能,打好基礎很重要。那么我們現在就一起開始學習吧。

一、圖像色彩空間轉換

  • OpenCV中,圖像色彩空間轉換是一個非常基礎且重要的操作,就是將圖像從一種顏色表示形式轉換為另一種表示形式的過程。
  • 通過將圖像從一個色彩空間轉換到另一個色彩空間,可以更好地進行特定類型的圖像處理和分析任務。
  • 常見的顏色空間包括RGB、HSV、YUV等。

1.1 RGB顏色空間

1.1.1 RGB顏色空間概念

  • RGB代表紅色(Red)、綠色(Green)和藍色(Blue),這三種顏色通過不同強度的光的組合來創建其他顏色。
  • RGB顏色空間是我們接觸最多的顏色空間,是一種用于表示和顯示彩色圖像的一種顏色模型。

1.1.2 RGB顏色模型

RGB顏色模型基于笛卡爾坐標系,RGB顏色空間可以產生大約1600萬種顏色,幾乎包括了世界上的所有顏色,也就是說可以使用RGB顏色空間來生成任意一種顏色。

注意

  • 在OpenCV中,顏色是以BGR的方式進行存儲的,而不是RGB,這也是上面紅色的像素值是(0,0,255)而不是(255,0,0)的原因。

1.1.3 關于顏色加法

(1)注意點:兩個圖像應該具有相同的大小和類型。

(2)方法:

  • 使用OpenCV的 cv.add() 函數。
  • 通過numpy操作添加兩個圖像,如res = img1 + img2。

(3)區別:OpenCV加法和Numpy加法之間存在差異。OpenCV的加法是飽和操作,而Numpy添加是模運算

1.1.4 顏色加權加法

(1)方法:

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

(2)參數解釋:

  • src1src2:輸入圖像。

  • alphabeta:兩張圖象權重。

  • gamma:亮度調整值。

    • gamma > 0,圖像會變亮。

    • gamma < 0,圖像會變暗。

    • gamma = 0,則沒有額外的亮度調整。

(3)代碼演示:

仍沿用之前的圖片文件夾位置

import cv2 as cv
import numpy as npcao = cv.imread("../images/cao.png")
pig = cv.imread("../images/pig.png")# 飽和操作
add1 = cv.add(cao, pig)# print(cao)
# print(pig)
# print(add)# numpy是取模運算
add2 = cao + pig
# 一樣大小的圖片可以進行加法運算
x = np.uint8([[250]])
y = np.uint8([[10]])
xy1 = cv.add(x, y)
xy2 = x + y
print(xy1)
print(xy2)# 加權加法 cv.addWeighted(img1, a, img2, b, c)  c是亮度調節
add3 = cv.addWeighted(cao, 0.3, pig, 0.7, -20)cv.imshow("add", add1)
cv.imshow("add2", add2)
cv.imshow("add3", add3)
# cv.imshow("cao", cao)
# cv.imshow("pig", pig)
cv.waitKey(0)
cv.destroyAllWindows()

1.2 HSV顏色空間

1.2.1 HSV顏色空間概念

  • HSV顏色空間指的是HSV顏色模型,這是一種與RGB顏色模型并列的顏色空間表示法。
  • HSV顏色空間使用色調(Hue)、飽和度(Saturation)和亮度(Value)三個參數來表示顏色,色調H表示顏色的種類,如紅色、綠色、藍色等;飽和度表示顏色的純度或強度,如紅色越純,飽和度就越高;亮度表示顏色的明暗程度,如黑色比白色亮度低。

1.2.2 HSV顏色模型

HSV顏色模型是一種六角錐體模型:

附圖:HSV顏色模型

色調 H: 0 ~ 180

飽和度 S: 0 ~ 255

亮度 V: 0 ~?255

附圖:顏色對照表

1.2.3 應用意義

  • 使用HSV空間處理圖像可以更直觀地調整顏色和進行色彩平衡等操作,更符合人類的感知習慣。
  • 在HSV顏色空間中,色調、飽和度和亮度的調整都是直觀的,而在RGB顏色空間中調整顏色不那么直觀。
  • 在圖像處理中,降維處理可以減少計算的復雜性和計算量。HSV顏色空間相對于RGB顏色空間,減少了兩個維度(紅、綠、藍),這有利于進行一些計算和處理任務,比如色彩分割、匹配等。

因此,在進行圖片顏色識別時,我們會將RGB圖像轉換到HSV顏色空間,然后根據顏色區間來識別目標顏色。

1.3 顏色轉換

1.3.1 轉換方法

方法:cv2.cvtColor(img,code)

  • img:輸入圖像,可以是一個Numpy數組繪著一個OpenCV的Mat對象

    • Mat 是一個核心的數據結構,主要用于存儲圖像和矩陣數據。在 Python 中使用 OpenCV 時,通常直接處理的是 NumPy 數組,cv2 模塊自動將 Mat 對象轉換為 NumPy 數組。二者之間的轉換是透明且自動完成的。例如,當你使用 cv2.imread() 函數讀取圖像時,返回的是一個 NumPy 數組,但在C++中則是 Mat 對象。

  • code:指定轉換的類型,可以使用預定義的轉換代碼。

    • 例如cv2.COLOR_RGB2GRAY表示從rgb到灰度圖像的轉換。

1.3.2?RGB轉Gray, RGB轉HSV

代碼演示:

import cv2 as cv# 讀取圖片
img = cv.imread("../images/1.jpg")# 轉換為HSV cv.cvtColor(img, code)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)cv.imshow("hsv", hsv)
cv.imshow("gray", gray)
cv.imshow("rgb", rgb)cv.waitKey(0)
cv.destroyAllWindows()

二、圖像灰度化處理

將彩色圖像轉換為灰度圖像的過程稱為灰度化,這種做法在圖像處理和計算機視覺領域非常常見。

2.1 概念基礎

2.1.1 灰度圖

  • 灰度圖像與黑白圖像不同,在計算機圖像領域中黑白圖像只有黑色與白色兩種顏色;但是,灰度圖像在黑色與白色之間還有許多級的顏色深度。
  • 灰度圖像經常是在單個電磁波頻譜如可見光內測量每個像素的亮度得到的,用于顯示的灰度圖像通常用每個采樣像素8位的非線性尺度來保存,這樣可以有256級灰度。

2.1.2 轉化為彩色圖

灰度圖與彩色圖最大的不同就是:彩色圖是由R、G、B三個通道組成,而灰度圖只有一個通道,也稱為單通道圖像,所以彩色圖轉成灰度圖的過程本質上就是將R、G、B三通道合并成一個通道的過程。

2.1.3 兩個極端的灰度值

在灰度圖像中,“極端”的灰度值指的是亮度的兩個極端:最暗和最亮的值。

  • 最暗的灰度值:0。這代表完全黑色,在灰度圖像中沒有任何亮度。

  • 最亮的灰度值:255。這代表完全白色,在灰度圖像中具有最大亮度。

2.2 灰度化處理方法

2.2.1 最大值法

對彩色圖像的每個像素,從R、G、B三個通道的值中選出最大的一個,并將其作為灰度圖像中對應位置的像素值。

import cv2 as cv
import numpy as nppig = cv.imread("../images/pig.png")
shape = pig.shape# 創建一張和原圖大小一樣的全零圖片
gray = np.zeros((shape[0], shape[1]), dtype=np.uint8)# 灰度化,循環遍歷每行的每一列
for i in range(shape[0]):for j in range(shape[1]):gray[i, j,] = max(pig[i, j, 0], pig[i, j, 1], pig[i, j, 2])cv.imshow("gray", gray)
cv.waitKey(0)
cv.destroyAllWindows()

2.2.2 平均值法

對彩色圖像的每個像素,將其R、G、B三個通道的像素值全部加起來,然后再除以三,得到的平均值就是灰度圖像中對應位置的像素值。

import cv2 as cv
import numpy as nppig = cv.imread("../images/pig.png")
shape = pig.shape# 創建一張和原圖大小一樣的全零圖片
gray = np.zeros((shape[0], shape[1]), dtype=np.uint8)# 灰度化,循環遍歷每行的每一列
for i in range(shape[0]):for j in range(shape[1]):gray[i, j] = np.uint8((int(pig[i, j, 0]) + int(pig[i, j, 1]) + int(pig[i, j, 2]))//3)cv.imshow("gray", gray)
cv.waitKey(0)
cv.destroyAllWindows()

2.2.3 加權均值法

  • 對于彩色圖像的每個像素,按照一定的權重去乘以每個通道的像素值,并將其相加,得到最后的值就是灰度圖像中對應位置的像素值。
  • 對于彩色圖像的每個像素,它會按照一定的權重去乘以每個通道的像素值,并將其相加,得到最后的值就是灰度圖像中對應位置的像素值。

將上面的代碼改一下即可:

import cv2 as cv
import numpy as nppig = cv.imread("../images/pig.png")
shape = pig.shape# 創建一張和原圖大小一樣的全零圖片
gray = np.zeros((shape[0], shape[1]), dtype=np.uint8)# 灰度化,循環遍歷每行的每一列
# for i in range(shape[0]):
#   for j in range(shape[1]):
#       gray[i, j] = np.uint8((int(pig[i, j, 0]) + int(pig[i, j, 1]) + int(pig[i, j, 2]))//3)# 加權均值法
wb, wg, wr = 0.35, 0.59, 0.6
for i in range(shape[0]):for j in range(shape[1]):gray[i, j] = np.uint8((int(pig[i, j, 0]) * wb + int(pig[i, j, 1]) * wg + int(pig[i, j, 2]) * wr)//3)cv.imshow("gray", gray)
cv.waitKey(0)
cv.destroyAllWindows()

補充說明:

在OpenCV中,內置的灰度化處理函數是:

gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

默認的加權系數(BT.601標準)為:

Gray = 0.114 * B + 0.587 * G + 0.299 * R

這是基于人眼視覺特性制定的加權標準:

  • 人眼對 綠色最敏感,因此 G 權重大;
  • 藍色最不敏感,因此 B 權重最小;
  • 紅色則居中。

這個標準來自ITU-R BT.601視頻色彩轉換標準。

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

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

相關文章

Java TCP 通信詳解:從基礎到實戰,徹底掌握面向連接的網絡編程

作為一名 Java 開發工程師&#xff0c;你一定在實際開發中遇到過需要建立穩定連接、可靠傳輸、有序通信等場景。這時&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09; 通信就成為你必須掌握的重要技能之一。TCP 是一種面向連接、可靠、基于字節流的傳輸協…

HTML5 網頁游戲設計開發——1、HTML基礎

前言 互聯網上的應用程序被稱為Web程序&#xff0c;Web引用用程序是用Web文檔&#xff08;網頁&#xff09;累表現用戶界面&#xff0c;而Web文檔都遵守HTML格式。HTML5是最新的HTML標準。之前的版本HTML4.01于1999年發布&#xff0c;小20年過去了&#xff0c;互聯網已經發聲了…

opencv圖片標注

功能使用python opencv, 將文字信息標注在圖片中同一張圖片中涉及多次標注文字大小為標注框的0.3倍使用多綫程運行import cv2 import threading import numpy as npdef draw_annotations(item, annotations):"""在圖片上繪制標注框和文本annotations: 標注列表…

矩陣SVD分解計算

對于有數學庫的時候,進行矩陣相關計算還是不復雜,但是沒有數學庫就很麻煩,利用算法實現了矩陣奇異值分解。 void decompose(const std::vector<std::vector<double>>& A, std::vector<std::vector<double>>& U, std::vector<dou…

Flutter基礎(前端教程①⑦-Column豎直-Row水平-Warp包裹-Stack堆疊)

MainAxisAlignment 是一個枚舉類&#xff0c;用于控制主軸&#xff08;Main Axis&#xff09; 方向上子組件的排列和對齊方式。MainAxisAlignment 的常用取值及效果&#xff1a;MainAxisAlignment.start子組件沿主軸的起點對齊&#xff08;Row 左對齊&#xff0c;Column 頂部對…

構建智能視頻中樞--多路RTSP轉RTMP推送模塊在軌道交通與工業應用中的技術方案探究

1?? 行業背景與技術需求&#x1f688; 軌道交通行業對視頻監控的深度依賴在現代城市軌道交通系統中&#xff0c;視頻監控已不僅僅是安防的一部分&#xff0c;更是貫穿于運營管理、車輛調度、應急指揮和安全保障的核心技術手段。列車車載監控 ——列車上普遍部署多路高清攝像頭…

【Android Studio 2025 漢化教程】

廢話不多說&#xff0c;直接上干貨。 前提&#xff1a;JeBrains系列2025版已經集成中文插件&#xff0c;用戶不需下載&#xff0c;只要設置下即可&#xff0c;但Android Studio并不內置也不提供漢化插件。需要工具&#xff1a; 1.IDEA&#xff08;其他JeBrains系列也可以&#…

網絡安全初級(前端頁面的編寫分析)

源代碼index.html<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登錄頁面</title><!--…

RAG項目實戰:LangChain 0.3集成 Milvus 2.5向量數據庫,構建大模型智能應用

項目背景 最近&#xff0c;有時間&#xff0c;想著動手實戰一下&#xff0c;從0到1搭建一個 RAG 系統&#xff0c;也是想通過實戰的方式來更進一步學習 RAG。因此&#xff0c;就定下了以項目實戰為主&#xff0c;書籍為輔的執行方式。&#xff08;書籍是黃佳老師著的《RAG 實戰…

docker build 和compose 學習筆記

目錄 docker build 筆記 1. 路徑解析 2. 關鍵注意事項 2. docker compose up -d 核心區別對比 常見工作流 補充說明 1. 功能區別 2. 協作關系 場景 1&#xff1a;Compose 自動調用 Build 場景 2&#xff1a;先 Build 后 Compose 3. 關鍵區別 4. 為什么需要協作&…

Java學習第六十六部分——分布式系統架構

目錄 一、前言提要 二、核心目標 三、核心組件與技術 1. 服務拆分與通信 2. 服務注冊與發現 3. 配置中心 4. 負載均衡 5. 熔斷、降級與限流 6. API 網關 7. 分布式數據管理 8. 分布式追蹤與監控 9. 容器化與編排 四、典型Java分布式技術棧組合 五、關鍵…

Pycharm的Terminal打開后默認是python環境

Pycharm的Terminal打開后默認是python環境解決方案Pycharm的Terminal打開后默認是python環境&#xff0c;無法執行pip等命令&#xff0c;也沒辦法退出 解決方案 點擊Settings -> Tools -> Terminal 可以看到當前默認打開的是torch19py38環境中的python.exe&#xff08;…

LVS——nat模式

一、搭建nat模式下LVS的實驗環境1.創建四臺虛擬機client——客戶端&#xff1a;192.168.134.111/24&#xff08;nat模式&#xff09;LVS——調度器【雙網卡】&#xff1a;192.168.134.112/24&#xff08;nat模式&#xff09;、172.25.254.111/24&#xff08;僅主機模式&#xf…

ElasticSearch是什么

ElasticSearch是什么 ElasticSearch 是一個基于 Apache Lucene 的開源分布式搜索引擎&#xff0c;用于全文搜索、日志分析、實時數據分析等場景。它以高性能、分布式架構和易用性著稱&#xff0c;支持 JSON 格式的數據存儲和查詢&#xff0c;廣泛應用于日志監控、搜索服務、企業…

linxu CentOS 配置nginx

1、準備要發布的文件夾sudo mkdir -p /var/www/myfiles # 創建文件夾&#xff08;如果不存在&#xff09; sudo chmod -R 755 /var/www/myfiles # 設置權限&#xff08;確保 Nginx 可以讀取&#xff09; sudo chown -R nginx:nginx /var/www/myfiles # 修改所有者&#xff0…

內網穿透利器:基于HTTPHTTPS隧道的代理工具深度解析

內網穿透利器&#xff1a;基于HTTP/HTTPS隧道的代理工具深度解析 一、引言 在滲透測試和內網滲透中&#xff0c;HTTP/HTTPS隧道技術是突破網絡邊界的關鍵手段。它通過將TCP流量封裝在HTTP協議中&#xff0c;穿透防火墻/NACL策略&#xff0c;實現內網橫向移動。本文以reGeorg為…

容器編排K8S

k8s概述 容器部署優勢:部署方便,不依賴底層環境,升級鏡像 本質是一個容器編排工具,golang語言開發 master master管理節點:kube-api-server請求接口,kube-scheduler調度器,kube-controller-manager控制器/管理器,etcd分布式存儲數據庫 work node服務節點:kubelet代理保…

C語言:深入理解指針(1)

1. 內存和地址在了解指針前&#xff0c;我們需要知道內存和地址是什么。1.1 內存首先來看內存。舉個例子&#xff1a;當你在酒店找房間時&#xff0c;你并不是一層一層一間一間找&#xff0c;而是通過酒店為每間房子設置的門牌號直接找到你的房間&#xff0c;這樣的效率就會快很…

完整的 SquareStudio 注冊登錄功能實現方案:已經燒錄到開發板正常使用

根據你的需求&#xff0c;我將提供完整的實現方案&#xff0c;解決按鈕同時執行多個動作的問題&#xff0c;并確保注冊登錄功能正常工作。所需文件結構需要創建和修改的文件如下&#xff1a;ui_events.h - 事件處理函數聲明events.c - 實際的事件處理邏輯ui.c - UI 初始化和事件…

OkHttp 與 Chuck 結合使用:優雅的 Android 網絡請求調試方案

前言在 Android 應用開發過程中&#xff0c;網絡請求調試是日常工作中不可或缺的一部分。Chuck 是一個輕量級的 OkHttp 攔截器&#xff0c;能夠在應用內直接顯示網絡請求和響應的詳細信息&#xff0c;無需連接電腦或使用額外工具。本文將詳細介紹如何將 OkHttp 與 Chuck 結合使…