Python 计算机视觉(四)—— OpenCV进行图像算数与逻辑运算
目錄
1. 圖像加法運算
(1)隨機生成灰度圖像
(2)讀取原始圖像
(3)兩圖像相加
(4)圖像像素點加常數(shù)
2. 圖像減法運算
(1)減小亮度
(2)還原添加灰度圖像的圖像?
3. 圖像與運算
4. 圖像或運算
5. 圖像異或運算
6. 圖像非運算
7. 圖像邏輯運算的意義
結束語
1. 圖像加法運算
圖像加法運算是將一幅圖像加在另外一幅圖像上面或者對圖像的某一個像素點值進行操作,加上一個常數(shù)改變其亮度或者顏色
(1)隨機生成灰度圖像
參考資料:圖像的像素加法、減法運算
import numpy as np import cv2 #np.random.randint(a, b)生成大于等于 a 小于 b 的隨機整數(shù) img_gray = np.random.randint(0, 256, size=[406, 600], dtype=np.uint8)#生成一張 406*600 的隨機灰度圖 cv2.namedWindow("gray") cv2.imshow("gray", img_gray) cv2.waitKey(delay = 0)(2)讀取原始圖像
首先是從電腦獲得已經(jīng)下載的圖像:
import numpy as np import cv2img1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg') #讀取圖像 cv2.namedWindow("awindow") #創(chuàng)建窗口 img1_1 = cv2.resize(img1, dsize= None, fx = 0.5, fy = 0.5)#對圖像尺寸進行調整 cv2.imshow("awindow", img1_1) #顯示圖像 cv2.waitKey(delay = 0) #等待 print(img1_1.shape) #讀取圖像信息并得到圖像的信息:
(406, 600, 3)? 圖像的分辨率以及通道,之前的灰度圖像就是以這個圖像的大小生成的?
?(3)兩圖像相加
?使用 cv2.addWeighted() 函數(shù)
該函數(shù)包括參數(shù):圖像1,圖像1權值,圖像2,圖像2權值,為合成后的圖像像素值所加的數(shù)
使用該函數(shù)時,兩圖像分辨率必須一致,圖像通道數(shù)也要一致
本例中是將上面的灰度圖像和讀取的圖像相加得到的
主要實現(xiàn)方法如下,我已經(jīng)添加了注釋
""" Author:XiaoMa date:2021/10/15 """ import numpy as np import cv2img1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg') #讀取圖像 cv2.namedWindow("awindow") #創(chuàng)建窗口 img1_1 = cv2.resize(img1, dsize= None, fx = 0.5, fy = 0.5)#調整大小 img_gray0 = cv2.cvtColor(img1_1, cv2.COLOR_BGR2GRAY) #對圖像進行灰度處理 cv2.imshow("awindow", img_gray0) #顯示圖像 cv2.waitKey(delay = 0) #等待img_gray = np.random.randint(0, 256, size=[406, 600], dtype=np.uint8)#生成隨機灰度圖 cv2.namedWindow("gray") cv2.imshow("gray", img_gray) print(img_gray.shape) #讀取灰度圖屬性 cv2.waitKey(delay = 0)final_img = cv2.addWeighted(img_gray0, 0.8, img_gray, 0.2, 8) #將兩個圖相加 cv2.namedWindow("windowfinal") cv2.imshow("windowfinal", final_img) cv2.waitKey(delay = 0)得到最終圖像:
可以看出兩種圖像相加,但還是能分辨出美女,這是因為我們在相加時將美女的權值調為 0.8 ,所以整張圖中主要顯示的還是美女
如果將權值修改一下:
final_img = cv2.addWeighted(img_gray0, 0.5, img_gray, 0.5, 8)讓二者五五開,得到如下圖像:?
(4)圖像像素點加常數(shù)
在前面的文章中提到過,圖像的像素點值代表其亮度
在這里我們嘗試給每一個像素點加上 50 并與原圖對比
首先我們得創(chuàng)建一個和原圖同等尺寸的矩陣
Mix = np.ones(img1_1.shape, dtype=np.uint8)*50 #生成一個單位矩陣并乘以50,單位矩陣維度和 img1_1 相同 Addimg = cv2.add(Mix, img1_1) #給每一個像素點加50 cv2.namedWindow("Addimg") cv2.imshow("Addimg", Addimg) cv2.waitKey(delay = 0)得到的圖像如下:?
2. 圖像減法運算
(1)減小亮度
cv2.subtract() 函數(shù)可以實現(xiàn)圖像之間的減法下面我們還原上面得到的圖像:
img1_2 = cv2.subtract(Addimg, Mix) #在得到的圖像中減去矩陣 cv2.namedWindow("subimg") cv2.imshow("subimg", img1_2) cv2.waitKey(delay = 0)?得到的效果如下:
可見最上面的圖還原了中間的那一幅圖像?
(2)還原添加灰度圖像的圖像?
在前面我們將灰度圖像和原始圖像相加得到一幅比較模糊的圖像,這里我們嘗試對它進行還原
img1_3 = cv2.subtract(final_img, img_gray) cv2.namedWindow("subimg1") cv2.imshow("subimg1", img1_3) cv2.waitKey(delay = 0)得到的最終圖像如下(subimg1 窗口):
?可以看出減去灰度圖像得到的圖像并沒有將原圖復原出來,這是因為我們之前將兩圖像進行相加是按照權值相加的,所以直接減去灰度圖像會使整個圖像亮度降低
3. 圖像與運算
在圖像的運算中參考的資料:openCV—Python(6)—— 圖像算數(shù)與邏輯運算
img1_4 = cv2.bitwise_and(img_gray0, img_gray) #對兩種圖像進行與操作 cv2.namedWindow("And") cv2.imshow("And", img1_4) cv2.waitKey(delay = 0)得到的圖像如下:
由于生成的灰度圖像為單通道圖像,所以需要將原圖像轉化為灰度圖像才能相與,再讀入一幅三通道的圖像進行與操作:
代碼大致如下:
""" Author:XiaoMa date:2021/10/15 """ import numpy as np import cv2img1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg') cv2.namedWindow("beauty0") img1_1 = cv2.resize(img1, dsize= None, fx = 0.5, fy = 0.5) cv2.imshow("beauty0", img1_1) print(img1_1.shape) cv2.waitKey(delay = 0)img1_5 = cv2.imread('E:\From Zhihu\For the desk\de1.jpg') img1_50 = cv2.resize(img1_5, dsize= None, fx = 0.834, fy = 0.903) #調整大小和前一幅圖像一致 cv2.namedWindow("beauty1") cv2.imshow("beauty1", img1_50) cv2.waitKey(delay = 0) print(img1_50.shape)img1_51 = cv2.bitwise_and(img1_1, img1_50) cv2.namedWindow("Add1") cv2.imshow("Add1", img1_51) cv2.waitKey(delay = 0)?得到的圖像:
。。。。。離了個大譜!beauty0 和 beauty1 都沒了
4. 圖像或運算
操作方式和圖像的與運算一樣,只是函數(shù)的名稱變了
img1_51 = cv2.bitwise_or(img1_1, img1_50) #對兩圖像進行或運算得到的最終圖像:
??
5. 圖像異或運算
img1_51 = cv2.bitwise_xor(img1_1, img1_50) #對兩圖像進行異或操作得到的圖像如下:?
6. 圖像非運算
對一個圖像進行非操作
img1_51 = cv2.bitwise_not(img1_1) #對讀取的圖像進行非操作 cv2.namedWindow("Not") cv2.imshow("Not", img1_51) cv2.waitKey(delay = 0)7. 圖像邏輯運算的意義
參考資料:知乎回答
圖像處理-邏輯運算
首先簡單的算術運算對于圖像來說就是對像素點值進行處理,為一幅圖像加上一些要素或者減去一些要素,來觀察圖像的變化或者不同
在邏輯運算中,與運算可以求出兩圖像相交的部分,即對應的像素如果同時為真時結果為真;
非運算主要是將黑變?yōu)榘?#xff0c;將白變?yōu)楹?#xff0c;對灰度圖像的處理十分有效;
或運算可以求兩種圖像的合并,一個像素點為真時結果為真;
異或運算當兩像素點相同時結果為真,不同時結果為假,可以得到兩種圖像不相交的部分,可以將圖像進行扣出或者其他操作。
結束語
這篇文章主要匯總了圖像處理過程中的一些算數(shù)運算和邏輯運算,也簡單介紹了它們的意義,主要涉及一些基礎操作,為后面的學習打下基礎;對于一些參考資料我也添加在文章中了,如果想深入了解可以點進去進行學習。
總結
以上是生活随笔為你收集整理的Python 计算机视觉(四)—— OpenCV进行图像算数与逻辑运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 计算机视觉(三)—— 数字
- 下一篇: Python 计算机视觉(五)—— Op