Python OpenCV 之图像乘除与像素的逻辑运算,图像处理取经之旅第 17 天
今天的學(xué)習(xí)的內(nèi)容是:通過 Python OpenCV 對圖像實(shí)現(xiàn)乘除操作,涉及函數(shù)為 cv2.multiply 與 cv2.divide。后面又補(bǔ)充了一些像素的邏輯運(yùn)算,以及一個綜合案例
cv2.multiply
該函數(shù)的語法格式如下:
cv2.multiply(src1, src2, dst=None, scale=None, dtype=None)參數(shù)說明:
src1:第一張圖像
src2:第二張圖像
dst:可選參數(shù),目標(biāo)圖像,需要提前分配空間,可省略
mask:掩膜
scale:縮放比,常量,即在 src1*src2 的基礎(chǔ)上再乘 scale
dtype:輸出圖像數(shù)組的深度,默認(rèn)等于-1
測試下面的代碼,嘗試之后,發(fā)現(xiàn)乘法很容易就全黑或者全白,畢竟兩個數(shù)字相乘知乎,很容易超過 255。
import cv2 as cvdef multiply_demo(src1, src2):ret = cv.multiply(src1, src2)cv.imshow("multiply_demo", ret)cv.waitKey(0)if __name__ == "__main__":src1 = cv.imread("./18_3.jpeg")src2 = cv.imread("./18_4.jpg")multiply_demo(src1, src2)
如果 cv2.multiply 函數(shù)的第二個圖像為一個標(biāo)量,那運(yùn)行結(jié)果是針對單一通道進(jìn)行疊加。
運(yùn)行效果截圖:
cv2.divide
該函數(shù)的語法格式為:
divide(src1, src2, dst=None, scale=None, dtype=None)本部分與相乘基本一致,圖像相除最后很容易得到一個全黑的圖。
具體可以自行嘗試。
像素的邏輯運(yùn)算
像素的邏輯運(yùn)算涉及與、或、非、異或等基本運(yùn)算(要進(jìn)行邏輯運(yùn)算,兩張圖片的形狀(shape)必須一樣)
對應(yīng)函數(shù)的格式如下
cv2.bitwise_and(src1, src2,mask)
作用:對二進(jìn)制數(shù)據(jù)進(jìn)行“與”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進(jìn)行二進(jìn)制“與”操作,1&1=1,1&0=0,0&1=0,0&0=0,
這個里面的掩膜非常有用,我們細(xì)說一下。
在徹底學(xué)習(xí)演膜之前,需要接觸一個新的概念,又要學(xué)習(xí)新東西啦。
而且在接下來的幾篇博客,都要圍繞演膜與 ROI 展開,因?yàn)樵趯W(xué)習(xí)的時候,發(fā)現(xiàn)這部分知識很重要。
ROI(感興趣區(qū)域,英文全稱叫做 Region Of Internet)
下面我們實(shí)現(xiàn)找到 ROI,并且移動 ROI,代碼如下:
下述代碼測試圖片,使用的是:
我們要獲取的是蕾姆的犄角
上述代碼,你可以在學(xué)習(xí)過程中自行解開查閱。重點(diǎn)部分都已經(jīng)寫在注釋里面了。
獲取到犄角圖之后,我們在對其進(jìn)行二值化操作,具體代碼如下
import cv2 as cvpath = r"1919.jpeg"# 讀取圖片 image = cv.imread(path) # 輸出圖片形狀 # 注意輸出的元組(rows,cols,dtype) print(image.shape) # cv.imshow("image", image) # 捕捉犄角區(qū)域 horn = image[60:100, 180:240]# 犄角轉(zhuǎn)換成灰度圖 gray_horn = cv.cvtColor(horn, cv.COLOR_BGR2GRAY)# 獲取到了犄角的二值化圖像 thresh, mask = cv.threshold(gray_horn, 160, 255, cv.THRESH_BINARY)# 獲取 mask 的反色圖像 mask_inv = cv.bitwise_not(mask) # cv.imshow("mask", mask)# 打開一個彩色糖果圖片 colors = cv.imread(r"colors.jpg") # 選中一塊與 mask 相同大小的 ROI rows, cols = mask.shape[:2] pie_colors = colors[10:10+rows, 20:20+cols] print(pie_colors.shape) print(mask.shape) cv.imshow("pie_colors", pie_colors)# 選出犄角部分 img1_bg = cv.bitwise_and(horn, pie_colors, mask=mask) # cv.imshow("img1_bg", img1_bg) img2_fg = cv.bitwise_and(horn, horn, mask=mask_inv) # cv.imshow("img2_fg", img2_fg) # 兩個犄角合并在一起 add_img = image.copy() # 對原圖像進(jìn)行拷貝 dst = cv.addWeighted(img1_bg, 0.3, img2_fg, 1, 0) # cv.imshow("dst", dst) add_img[60:100, 180:240] = dst # image[60:100, 180:240] = back_horncv.imshow("origin", image) cv.imshow("new", add_img)cv.waitKey() cv.destroyAllWindows()上面的代碼,理解起來有寫難度,本階段先嘗試?yán)斫饧纯?#xff08;橡皮擦在寫的時候,也暈掉了,總感覺缺少一些知識,沒有吃透)
用到了以前學(xué)習(xí)的二值化操作,用到了灰度圖,也用到了圖像疊加。
也有可能是因?yàn)榘咐x擇的不好,最后更換犄角之后的圖片很難看,如下圖所示。
看起來,缺少一部分融合的效果。后面知識比較全面之后,可能對這些理解會更加深入。
效果雖然丑爆了,但是終究是能操作指定區(qū)域了。
上述代碼也用到了下面的邏輯運(yùn)算,先理解含義,后面逐步展開內(nèi)容。
cv2.bitwise_or(src1, src2,mask)
作用:對不同通道相同位置的二進(jìn)制值進(jìn)行"或"運(yùn)算(對應(yīng)位置只要有一個為 1,結(jié)果就為 1)。
cv2.bitwise_not()
作用:按位取反
cv2.bitwise_xor(src1,src2,dst,mask)
作用:輸出兩個圖像的異或 dst = src1 ^ src2
測試代碼如下:
import cv2 import numpy as np from matplotlib import pyplot as pltsrc1 = cv2.imread('18_1.jpg') src2 = cv2.imread('18_2.jpg') d_and = cv2.bitwise_and(src1, src2) d_or = cv2.bitwise_or(src1, src2) d_not = cv2.bitwise_not(src1) d_xor = cv2.bitwise_xor(src1, src2)title = ['src1', 'src2', 'and', 'or', 'not', 'xor'] images = [src1, src2, d_and, d_or, d_not, d_xor] for i in range(6):plt.subplot(2, 3, i+1)plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB), 'gray'), plt.title(title[i]) plt.show()代碼運(yùn)行之后的效果如圖:
下篇博客,將使用之前的內(nèi)容,加上像素的邏輯運(yùn)算完成一個【扣章效果】。
學(xué)習(xí)完今天的效果之后,發(fā)現(xiàn)對以前學(xué)過的地方有遺漏,后面幾篇博客,基于已經(jīng)學(xué)習(xí)的知識,好好夯實(shí)幾天吧。
OpenCV 尾聲
1 個小時又過去了,對 Python OpenCV 相關(guān)的知識點(diǎn),你掌握了嗎?
空閑之余,可以訂閱橡皮擦的爬蟲百例課程學(xué)習(xí)爬蟲知識。
想學(xué) Python 爬蟲,可以訂閱橡皮擦專欄哦~ 🈲🈲🈲🈲 點(diǎn)擊發(fā)現(xiàn)驚喜 🈲🈲🈲🈲
今天是持續(xù)寫作的第 56 / 100 天。
如果你有想要交流的想法、技術(shù),歡迎在評論區(qū)留言。
如果你想跟博主建立親密關(guān)系,可以關(guān)注同名公眾號 夢想橡皮擦,近距離接觸一個逗趣的互聯(lián)網(wǎng)高級網(wǎng)蟲。
博主 ID:夢想橡皮擦,希望大家點(diǎn)贊、評論、收藏。
總結(jié)
以上是生活随笔為你收集整理的Python OpenCV 之图像乘除与像素的逻辑运算,图像处理取经之旅第 17 天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记 - 概率论:随机变量与独立同分布
- 下一篇: Sping系列课程--工厂