[python opencv 計算機視覺零基礎到實戰] 七、邏輯運算與應用

一、學習目標

  1. 了解opencv中圖像的邏輯運算
  2. 了解opencv中邏輯運算的應用

目錄

[python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld

[【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld

[[python opencv 計算機視覺零基礎到實戰] 三、numpy與圖像編輯] 一、opencv的helloworld

[[python opencv 計算機視覺零基礎到實戰] 四、了解色彩空間及其詳解] 一、opencv的helloworld

[[python opencv 計算機視覺零基礎到實戰] 五、對象追蹤] 一、opencv的helloworld
[python opencv 計算機視覺零基礎到實戰] 六、圖像運算

如有錯誤歡迎指出~

二、了解OpenCV中圖像運算的運用

2.1 了解and邏輯運算

在上一節中,我們了解了基本的圖像運算,這一節將了解在opencv將兩張圖片進行邏輯運算。邏輯運算在編程中較為常見的一種基本運算,在此不在進行贅述。我們首先了解一下opencv中的邏輯與運算,opencv中邏輯與運算與我們基本的邏輯與運算一致,也就是1 and 1為1,1 and 0 為0。我們可以通過一個小示例來直觀的感受opencv的and運算方式。

在opencv中,對兩個圖片進行邏輯與運算需要使用bitwise_and方法。bitwise_and方法接收2個圖片數組為參數。首先我們讀取2個圖片1bit與1bit3。

import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
img3 = cv2.imread(r'C:\Users\mx\Desktop\1bit3.jpg')cv2.imshow("img1", img1)
cv2.imshow("img3", img3)cv2.waitKey (0)
cv2.destroyAllWindows()

得到兩張圖片如下:

隨后使用bitwise_and方法對兩張圖片進行運算:

import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
img3 = cv2.imread(r'C:\Users\mx\Desktop\1bit3.jpg')
and_img=cv2.bitwise_and(img3,img1)
cv2.namedWindow("and_img",cv2.WINDOW_NORMAL)cv2.imshow("img1", img1)
cv2.imshow("img3", img3)
cv2.imshow("and_img", and_img)cv2.waitKey (0)
cv2.destroyAllWindows()

以上代碼中關鍵代碼為and_img=cv2.bitwise_and(img3,img1),在這一串代碼中對img3與img1進行了邏輯與運算。由于img1圖片只有“我是1_bit”文字為白色,其他區域為黑色,我們可以當成“我偶是1_bit”這個內容區域的值為1,然后黑色區域位置為0。這時黑色區域與img3圖片的通道區域值進行計算,那就是0與一個內容值進行邏輯與計算,那么結果為0,img1的文字部分值為1,與img3圖片相同的位置進行邏輯與計算,那么保留結果。這時,運算后的圖片則應該是生成一張帶有“我是1_bit”字樣的圖片,并且在字樣區域內帶有img3圖片內容。結果如下:

那將圖片img1改成如下情況呢:

這時“我是1_bit”’字樣區域的內容將會與另一張圖片計算后排出,這時結果將會產生一個0值的空缺部分,由于空白部分的值為1,邏輯運算后將會保留白色區域的另外一張圖片內容。

結果如下:

2.2 了解or邏輯運算

在opencv中既然存在and邏輯與,那么邏輯或大幾率存在是可能的。在opencv中,邏輯或運算與邏輯與運算相反,使用bitwise_or方法,傳入參數也是兩張用于邏輯計算的圖片。使用示例如下:

import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
img3 = cv2.imread(r'C:\Users\mx\Desktop\1bit3.jpg')
and_img=cv2.bitwise_or(img3,img1)
cv2.namedWindow("and_img",cv2.WINDOW_NORMAL)cv2.imshow("img1", img1)
cv2.imshow("img3", img3)
cv2.imshow("and_img", and_img)cv2.waitKey (0)
cv2.destroyAllWindows()

結果如下:

以上使用的圖片與2.1示例中圖片一致。邏輯或運算,只要不都為0則是1。圖片img1中,字體為白,其它部分為0,但由于進行邏輯運算時,黑色部分進行計算的區域對應img3是有內容的,也就是說img3中該部分的內容非0。那么,結果就是img3中的圖片內容,最終將會得到如上結果。

2.3 了解取反運算

取反運算非常簡單,就是黑的邊白,白的變黑;當然這樣說不嚴謹,但是卻很好反應了取反這個操作的結果;例如0取反則是1,1取反則是0。取反使用bitwise_not方法,bitwise_not方法接收一個圖片參數。以下方法依舊使用名為1bit的圖片。圖片為了方便查看在代碼中顯示了原圖內容。

import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
not_img=cv2.bitwise_not(img1)
cv2.imshow("img1 ", img1 )
cv2.imshow("not_img", not_img)
cv2.waitKey (0)
cv2.destroyAllWindows()

結果如下:

2.4 邏輯運算有什么用呢?

我們在前兩節中的值,可以通過inRange方法提取圖片中的指定顏色內容,但是提取出來后將會得到一個黑白圖片,那么如何對改圖片進行顏色的還原呢?想必有些同學學完邏輯運算后覺得應該是找到了方法。是的,我們可以通過邏輯運算對圖片進行顏色上的還原。因為我們提取出來的圖片是黑白圖片,提取出來指定顏色內容的區域為白色,那么只需要將圖片與原圖進行and運算,那么重合的部分就會顯示出來,這個時候就可以還原提取后圖片的顏色。但是,我們是哪個顏色提取出來的圖片是單通道的灰度圖片,怎么辦呢?不急,首先我們把之前的代碼貼上,方便查看:

import cv2
import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')
min=np.array([26,43,46])
max=np.array([34,255,255])
while True:r,img=capture.read()if r==False:breakhsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)cv2.imshow("flag", flag)cv2.imshow("hmbb", img)k=cv2.waitKey (40)if k==27:break
cv2.destroyAllWindows()

以上代碼已經在前兩節“對象跟蹤”小節講解,那么現在只需要對提取到的圖片與原圖進行一個and邏輯運算即可,添加以下代碼:

cflag=cv2.bitwise_and(img,img,mask=flag)

以上代碼bitwise_and添加了兩個相同的img參數,為什么添加呢?不急,下一節將會告訴大家。我們現在著重查看mask參數,mask參數賦值為提取到的flag目標區域的圖片,表示遮罩。將會在之前傳入的img中剔除不要的區域,只保留白色的區域,傳入的類型是8位單通道的灰度圖像。這時我們就可以將flag值賦值給mask,bitwise_and將會從img圖片中做邏輯運算去除我們不需要的黑色區域的圖片內容,這時將會得到一個顏色比較正常的海綿寶寶。完整代碼如下:

import cv2
import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')
img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
min=np.array([26,43,46])
max=np.array([34,255,255])
while True:r,img=capture.read()if r==False:breakhsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)cflag=cv2.bitwise_and(img,img,mask=flag)cv2.imshow("flag", flag)cv2.imshow("hmbb", img)cv2.imshow("cflag", cflag)k=cv2.waitKey (40)if k==27:break
cv2.destroyAllWindows()

結果如下:

邏輯運算的更多內容下一節將會講解。
該系列文章首發于ebaina

三、總結

  1. 了解了opencv中對圖像進行邏輯與運算使用bitwise_and方法
  2. 了解了opencv中對圖像進行邏輯或運算使用bitwise_or方法
  3. 了解了opencv中對圖像進行取反運算使用bitwise_not方法
  4. 了解了and方法的其他用途,用于mask遮罩剔除不需要的內容

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

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

相關文章

Android之如何判斷當前是阿拉伯布局的方法

1 問題 判斷當前是不是阿拉伯布局的方法 2 幾種判斷方法 @SuppressLint("NewApi")public static boolean isLayoutRtl(View view, Resources res) {if (res == null || view == null) return false;Locale curLocale = res.getConfiguration().locale;//如果當前語言…

【ArcGIS風暴】數字化實驗:數據采集與編輯完整操作流程

一.實驗平臺:ArcGIS 9.3 二.實驗目的:對甘肅省的十四個地級市進行圖像配準、數據采集。 三.實驗要求:掌握地理數據采集方法,圖像配準及坐標投影,選擇主要的點、線、面進行投影。 四.實驗數據:甘肅省統計數據,甘肅省行政區劃圖。 (一).影像配準 第一步:加載…

loadrunner java 參數化_LoadRunner 參數化詳解

LoadRunner,是一種預測系統行為和性能的負載測試工具。通過以模擬上千萬用戶實施并發負載及實時性能監測的方式來確認和查找問題,LoadRunner能夠對整個企業架構進行測試。通過使用 LoadRunner,企業能最大限度地縮短測試時間,優化性…

Android之實現RTL的ViewPager

1 問題 如何實現RTL的ViewPager,就是滑動方向和我們之前滑動的方向相反,比如一般,我們用ViewPager滑動4個圖片,依次順序是 1 2 3 4 ,我們在頁面1的時候,我們一般都是習慣向左滑動到2,現在需要實現手指向右滑動到2. 2 解決辦法 1)我們可以使用ViewPager2,這個是可以支…

Why Apache Spark is a Crossover Hit for Data Scientists [FWD]

Spark is a compelling multi-purpose platform for use cases that span investigative, as well as operational, analytics. Data science is a broad church. I am a data scientist — or so I’ve been told — but what I do is actually quite different from what oth…

Blazor University (21)使用 RenderFragments 模板化組件 —— 傳遞占位符

原文鏈接:https://blazor-university.com/templating-components-with-renderfragements/passing-placeholders-to-renderfragments/將占位符傳遞給 RenderFragments源代碼[1]說明:此頁面的靈感來自用戶 ?ister?agoo 的 Twitter 帖子。首先&#xff0c…

物聯網(車聯網)平臺架構方案

技術支持QQ:787728951、車載終端網關采用mina/nettyspring架構,獨立于其他應用,主要負責維護接入終端的tcp鏈接、上行以及下行消息的解碼、編碼、流量控制,黑白名單等安全控制,網關同時支持交通部JT/T808-2011、JT/T80…

[python opencv 計算機視覺零基礎到實戰] 八、ROI泛洪填充

一、學習目標 了解什么是ROI了解floodFill的使用方法 如有錯誤歡迎指出~ 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python opencv 計…

【經典回放】JavaScript學習詳細干貨筆記之(二)

【經典回放】JavaScript學習詳細干貨筆記之(一) 【經典回放】JavaScript學習詳細干貨筆記之(二) 【經典回放】JavaScript學習詳細干貨筆記之(三) 一、JavaScript 數組 JavaScript數組的定義、使用都是非常簡單的,從a17.htm就可以知道,僅僅定義的話,就使用: var …

java string類api_java基礎—String類型常用api

1、字符串比較equalsequalsIgnoreCase 忽略大小寫做比較2、字符串拆分(切片)splitString a "lemon:python:Java";//split切片之后的結果是一個一維字符串類型數組String[] arr a.split(":");for(int i 0 ;i System.out.println(arr[i]);}3、字符串截取…

解決沖突

人生不如意之事十之八九,合并分支往往也不是一帆風順的。 準備新的feature1分支,繼續我們的新分支開發: $ git checkout -b feature1 Switched to a new branch feature1修改readme.txt最后一行,改為: Creating a new …

Android之java.lang.OutOfMemoryError: Failed to allocate a ** byte allocation with **free bytes and 2M

1 問題 glide加載圖片出現oom java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM 2 解決辦法 1) 簡單粗暴點的在AndroidManifest.xml添加如下,增大安卓虛擬機內存 android:largeHeap"…

HQL入門學習

2019獨角獸企業重金招聘Python工程師標準>>> package myHibernate; /** 測試簡單的HQL語句* 2010年4月9日 23:36:54* */ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.uti…

Oracle精簡客戶端配置

2019獨角獸企業重金招聘Python工程師標準>>> 由于Oracle client體積很大。而且安裝后,基本上就用2個功能:TNS配置服務名和SQL*Plus。下面是一種小巧、快捷的Oracle客戶端配置方法: 1.下載Instant Client 下載地址: htt…

【經典回放】JavaScript學習詳細干貨筆記之(三)

【經典回放】JavaScript學習詳細干貨筆記之(一) 【經典回放】JavaScript學習詳細干貨筆記之(二) 【經典回放】JavaScript學習詳細干貨筆記之(三) 一、再次從var開始說起 var到底是什么? 在前面的所有介紹中, JavaScript的var變量說明、是非常令人迷惑的事情。 var中…

WinUI遷移到.NET MAUI個人體驗

遷移的初衷本人平時是做.net相關的工作,對于.net技術棧也有一些了解,自從新的.net能夠跨平臺之后,之前也有跨平臺的ui框架Xamarin,現在微軟推出了.NET MAUI這個說是 統一了開發體驗,而且都RC版本了,所以本人…

祝CSDN2021牛氣沖天祝我也撥云散霧

前言 2020年4月,我寫了一篇用turtle繪制《小清新風格的樹》,反響挺好。現在打算使用turtle修改一下繪制方式,因為線條的繪制太過考慮因素過多,如果使用方塊進行堆疊,繪制出來的形狀可以如馬賽克一樣,既符合…

Android之Only fullscreen opaque activities can request orientation

1 問題 使用透明的activity主題,并且固定了方向,在Android8.0手機上提示錯誤如下 Only fullscreen opaque activities can request orientation 2 解決辦法 簡單粗暴就是去在AndroidManifest.xml文件去掉當前activity配置的里面的橫豎屏方向設置 and…

wamp5.5.12安裝re dis擴展

轉載地址:http://hanqunfeng.iteye.com/blog/1984387 phpredis是個人覺得最好的一個php-redis客戶端,因為其提供的function與redis的命令基本一致,降低的了學習成本,同時功能也很全面。 一。linux安裝方法 phpredis下載地址&#…

java 數組轉bean_json數組轉java對象怎么轉

展開全部首先需要 commons-beanutils jar包,然后轉bean的方法為:62616964757a686964616fe59b9ee7ad9431333363386133/**** Title: transMap2Bean* param:param map* param:param obj* return:void* Description&#x…