python學opencv|讀取圖像(四十)掩模:三通道圖像的局部覆蓋

【1】引言

前序學習了使用numpy創建單通道的灰色圖像,并對灰色圖像的局部進行了顏色更改,相關鏈接為:

python學opencv|讀取圖像(九)用numpy創建黑白相間灰度圖_numpy生成全黑圖片-CSDN博客

之后又學習了使用numpy創建三通道的彩色圖像,并對彩色圖像按照不同通道進行了顏色更改,相關鏈接為:

python學opencv|讀取圖像(十)用numpy創建彩色圖像_python新建一張caise的圖片-CSDN博客

實際上還會有一些需求,只需要改變三通道彩色圖像的局部顏色,也就是獲得掩模效果,這就是今天文章的目標。

【2】可行性分析

根據上述文章,修改彩色圖像的顏色是通過修改各個通道的BGR值實現的,修改灰度圖像的顏色是通過修改各個像素點的BGR(本質上由于只有一個通道,所以本質上也是通過修改通道的BGR值實現 )實現。

import numpy as np  # 引入numpy模塊
import cv2 as cv  # 引入cv模塊canvas = np.ones((580, 580, 3), np.uint8)   # 繪制一個580*580大小的畫布,3代表有3個通道,unit8為圖像存儲格式

那如果對彩色圖像直接修改像素點的BGR,應該也會有顏色變化。

【3】代碼測試

在上述分析的基礎上,直接嘗試修改像素點的BGR值。

首先是引入相關模塊,繪制出畫布,此時的畫布為純黑色:

import numpy as np  # 引入numpy模塊
import cv2 as cv  # 引入cv模塊canvas = np.ones((580, 580, 3), np.uint8)   # 繪制一個580*580大小的畫布,3代表有3個通道,unit8為圖像存儲格式

然后在純黑色的畫布上,先把第50到300行,第20到280列改為純白色像素,然后顯示完整的畫布:

canvas[50:300,20:280,:]=255 #第50到300行,第20到280列為純白色像素cv.imshow('yanmo', canvas)  # 在屏幕展示掩模的效果
cv.imwrite('yanmo.png', canvas)  # 保存圖像

之后把畫布改為純白色,相應的把區域第50到300行,第20到280列改為純黑色像素,然后顯示完整的畫布:

canvas[:,:,:]=255 #畫布改為純白色像素
canvas[50:300,20:280,:]=0 #第50到300行,第20到280列為純黑色像素
cv.imshow('yanmo1', canvas)  # 在屏幕展示掩模的效果cv.imwrite('yanmo1.png', canvas)  # 保存圖像
cv.waitKey()  # 圖像不會自動關閉
cv.destroyAllWindows()  # 釋放所有窗口

代碼運行后,獲得的掩模效果為:

圖1 黑色畫布白色掩模

圖2 白色畫布黑色掩模?

?由圖1和 圖2可見,三通道彩色圖像,通過改像素點值的做法,也能實現修改圖像區域顏色的目標,也就是實現掩模效果。

此時的完整代碼為:

import numpy as np  # 引入numpy模塊
import cv2 as cv  # 引入cv模塊canvas = np.ones((580, 580, 3), np.uint8)   # 繪制一個580*580大小的畫布,3代表有3個通道,unit8為圖像存儲格式canvas[50:300,20:280,:]=255 #第50到300行,第20到280列為純白色像素cv.imshow('yanmo', canvas)  # 在屏幕展示掩模的效果
cv.imwrite('yanmo.png', canvas)  # 保存圖像canvas[:,:,:]=255 #畫布改為純白色像素
canvas[50:300,20:280,:]=0 #第50到300行,第20到280列為純黑色像素
cv.imshow('yanmo1', canvas)  # 在屏幕展示掩模的效果cv.imwrite('yanmo1.png', canvas)  # 保存圖像
cv.waitKey()  # 圖像不會自動關閉
cv.destroyAllWindows()  # 釋放所有窗口

【4】細節說明

在彩色圖像的掩模效果實現中,未單獨設置BGR通道值。

嘗試修改第二通道值,只需要增加代碼:

canvas[:,:,:]=255 #畫布改為純白色像素
canvas[50:300,20:280,:]=0 #第50到300行,第20到280列為純黑色像素
canvas[:,:,1]=0 #第二個通道值
cv.imshow('yanmo2', canvas)  # 在屏幕展示掩模的效果
cv.imwrite('yanmo2.png', canvas)  # 保存圖像

此時新獲得的圖像為:

圖3 白色畫布黑色掩模 + 所有二通道值=0

圖3出現了預料之外的結果,為探清緣由,在所有的掩模操作下增加代碼,讀取掩模區域中的像素點BGR值:

print("黑色畫布白色掩模像素數為[100,100]位置處的BGR=", canvas[100, 100])  # 獲取像素數為[100,100]位置處的BGR

這時候獲得的BGR輸出值為:

圖4? BGR值

可見,由于畫布顏色強制為白色,所有的BGR值本來是統一為255,但把第二通道的值改為0后,畫布的BGR組成就變為[255 0 255],這時候畫布就變成粉紅色。

為證明上述分析,新增一段代碼來做驗證:

canvas[:,:,:]=255 #畫布改為純白色像素
canvas[:,:,1]=0 #第二個通道值
cv.imshow('yanmo3', canvas)  # 在屏幕展示掩模的效果
cv.imwrite('yanmo3.png', canvas)  # 保存圖像
print("白色畫布+所有二通道BGR=0像素數為[100,100]位置處的BGR=", canvas[100, 100])  # 獲取像素數為[100,100]位置處的BGR
print("白色畫布+所有二通道BGR=0像素數為[500,500]位置處的BGR=", canvas[100, 100])  # 獲取像素數為[500,500]位置處的BGR

此時,先規劃白色畫布,然后直接強制第二通道值為0。

代碼運行后,獲得的圖像為:

圖5 白色畫布+所有二通道值=0

此時輸出的圖像為粉紅色,讀取的像素點BGR為:

圖6 白色畫布+所有二通道值像素BGR值

由圖6可見,各個像素點的BGR值都是[255 0 255],和圖3所示的粉紅色圖像相應像素點的BGR值讀取效果一致。

【5】總結

掌握了python+opencv三通道彩色圖像掩模效果的實現技巧。

?

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

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

相關文章

【全面解析】深入解析 TCP/IP 協議:網絡通信的基石

深入解析 TCP/IP 協議:網絡通信的基石 導語 你是否曾好奇,現代互聯網是如何實現全球設備之間的高速、穩定和可靠通信的?無論是瀏覽網頁、發送電子郵件,還是進行視頻通話,背后都離不開 TCP/IP 協議 的支撐。作為互聯網…

全面解析 Java 流程控制語句

Java學習資料 Java學習資料 Java學習資料 在 Java 編程中,流程控制語句是構建程序邏輯的關鍵部分,它決定了程序的執行順序和走向。通過合理運用這些語句,開發者能夠實現各種復雜的業務邏輯,讓程序更加靈活和智能。 順序結構 順…

Linux系統常用指令

查找文件 find / -name "<文件名>" 2>/dev/null //遍歷系統查找指定文件名文件ls -l | grep "<文件名>" //列出當前目錄下有關文件名的文件find -name sw_sfp_alarm_cfg.xml //查找文件名對應路徑 切換目錄 編輯文件 vi <文件…

【Unity】ScrollViewContent適配問題(Contentsizefilter不刷新、ContentSizeFilter失效問題)

最近做了一個項目&#xff0c;菜單欄讀取數據后自動生成&#xff0c;結果用到了雙重布局 父物體 嘗試了很多方式&#xff0c;也看過很多大佬的文章&#xff0c;后來自己琢磨了一下&#xff0c;當子物體組件自動生成之后&#xff0c;使用以下以下代碼效果會好一些&#xff1a; …

AI輔助醫學統計分析APP

AI輔助醫學統計分析APP 醫學統計分析的困難點在于開始階段分析的規劃和得出分析結果之后分析結果的解釋&#xff0c;前者之所以困難是因為分析方法繁多又有不同的使用條件&#xff0c;后者則是因為結果中術語較多&#xff0c;且各種分析方法術語又有不同&#xff0c;非統計專業…

[STM32 HAL庫]串口中斷編程思路

一、前言 最近在準備藍橋杯比賽&#xff08;嵌入式賽道&#xff09;&#xff0c;研究了以下串口空閑中斷DMA接收不定長的數據&#xff0c;感覺這個方法的接收效率很高&#xff0c;十分好用。方法配置都成功了&#xff0c;但是有一個點需要進行考慮&#xff0c;就是一般我們需要…

淺談Java之AJAX

一、基本介紹 在Java開發中&#xff0c;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一種用于創建動態網頁的技術&#xff0c;它允許網頁在不重新加載整個頁面的情況下與服務器進行交互。 二、關鍵點和示例 1. AJAX的基本原理 AJAX通過JavaScript的XMLHtt…

AutoSar架構學習筆記

1.AUTOSAR&#xff08;Automotive Open System Architecture&#xff0c;汽車開放系統架構&#xff09;是一個針對汽車行業的軟件架構標準&#xff0c;旨在提升汽車電子系統的模塊化、可擴展性、可重用性和互操作性。AUTOSAR的目標是為汽車電子控制單元&#xff08;ECU&#xf…

算法競賽之差分進階——等差數列差分 python

目錄 前置知識進入正題實戰演練 前置知識 給定區間 [ l, r ]&#xff0c;讓我們把數組中的[ l, r ] 區間中的每一個數加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做&#xff1f;很簡單&#xff0c;差分一下即可 還不會的小伙伴點此進入學習 進入正題 …

TDengine 做 Apache SuperSet 數據源

?Apache Superset? 是一個現代的企業級商業智能&#xff08;BI&#xff09;Web 應用程序&#xff0c;主要用于數據探索和可視化。它由 Apache 軟件基金會支持&#xff0c;是一個開源項目&#xff0c;它擁有活躍的社區和豐富的生態系統。Apache Superset 提供了直觀的用戶界面…

金融場景 PB 級大規模日志平臺:中信銀行信用卡中心從 Elasticsearch 到 Apache Doris 的先進實踐

導讀&#xff1a;中信銀行信用卡中心每日新增日志數據 140 億條&#xff08;80TB&#xff09;&#xff0c;全量歸檔日志量超 40PB&#xff0c;早期基于 Elasticsearch 構建的日志云平臺&#xff0c;面臨存儲成本高、實時寫入性能差、文本檢索慢以及日志分析能力不足等問題。因此…

虛幻商城 Fab 免費資產自動化入庫

文章目錄 一、背景二、實現效果展示三、實現自動化入庫一、背景 上一次寫了個這篇文章 虛幻商城 Quixel 免費資產一鍵入庫,根據這個構想,便決定將范圍擴大,使 Fab 商城的所有的免費資產自動化入庫,是所有!所有! 上一篇文章是根據下圖這部分資產一鍵入庫: 而這篇文章則…

游戲為什么失敗?回顧某平庸游戲

1、上周玩了一個老鼠為主角的游戲&#xff0c;某平臺喜1送的&#xff0c; 下載了很久而一直沒空玩&#xff0c;大約1G&#xff0c;為了清硬盤空間而玩。 也是為了拔掉心中的一根刺&#xff0c;下載了而老是不玩總感覺不舒服。 2、老鼠造型比較寫實&#xff0c;看上去就有些討…

親測有效!如何快速實現 PostgreSQL 數據遷移到 時序數據庫TDengine

小T導讀&#xff1a;本篇文章是“2024&#xff0c;我想和 TDengine 談談”征文活動的優秀投稿之一&#xff0c;作者從數據庫運維的角度出發&#xff0c;分享了利用 TDengine Cloud 提供的遷移工具&#xff0c;從 PostgreSQL 數據庫到 TDengine 進行數據遷移的完整實踐過程。文章…

C#,入門教程(01)—— Visual Studio 2022 免費安裝的詳細圖文與動畫教程

通過本課程的學習&#xff0c;你可以掌握C#編程的重點&#xff0c;享受編程的樂趣。 在本課程之前&#xff0c;你無需具備任何C#的基礎知識&#xff0c;只要能操作電腦即可。 不過&#xff0c;希望你的數學不是體育老師教的。好的程序是數理化的實現與模擬。沒有較好的數學基礎…

Linux探秘坊-------3.開發工具詳解(2)

1.動靜態庫和動靜態鏈接&#xff08;操作&#xff09; 靜態庫是指編譯鏈接時,把庫?件的代碼全部加?到可執??件中,因此?成的?件 ?較?,但在運?時也就不再需要庫?件了。其后綴名?般為“.a” 動態庫與之相反,在編譯鏈接時并 沒有把庫?件的代碼加?到可執??件中 ,?…

電腦開機出現Bitlock怎么辦

目錄 1.前言 2.產生原因&#xff1a; 1.系統異常關機 2.系統更新錯誤 3.硬件更換 4.CMOS電池問題 5.出廠設置 6.意外情況 3.解鎖步驟&#xff1a; 3.1&#xff1a;記住密鑰ID&#xff08;前6位&#xff09; 3.2&#xff1a;打開aka.ms/myrecoverykey網址 3.3&#…

C# 的 NLog 庫高級進階

一、引言 在 C# 開發的廣袤天地中&#xff0c;日志記錄宛如開發者的 “千里眼” 與 “順風耳”&#xff0c;助力我們洞察應用程序的運行狀態&#xff0c;快速定位并解決問題。而 NLog 庫&#xff0c;無疑是日志記錄領域中的璀璨明星&#xff0c;以其強大的功能、靈活的配置和出…

Avalonia系列文章之小試牛刀

最近有朋友反饋&#xff0c;能否分享一下Avalonia相關的文章&#xff0c;于是就抽空學習了一下&#xff0c;發現Avalonia真的是一款非常不錯的UI框架&#xff0c;值得花時間認真學習一下&#xff0c;于是邊學習邊記錄&#xff0c;整理成文&#xff0c;分享給大家&#xff0c;希…

10 為什么系統需要引入分布式、微服務架構

java技術的發展 在java開始流行起來之后&#xff0c;主要服務于企業家應用&#xff0c;例如ERP,CRM等等&#xff0c;這些項目是為企業內部員工使用&#xff0c;我們的思維是怎么用設計模式&#xff0c;如何封裝代碼。讓開發人員關注到業務上去&#xff0c;系統也就那么幾十幾百…