1. 程式人生 > >初識OpenCV 練習筆記整理--學習六。【影象的算術運算】

初識OpenCV 練習筆記整理--學習六。【影象的算術運算】

"""
學習內容:
    影象的算術運算

    目標:
        學習影象上的算術運算,加法,減法,位運算等。
        學習的函式有:cv2.add(), cv2.addWeighted()
"""
# 第一小節 影象的加法,使用函式cv2.add()將兩幅影象進行加法運算。注意兩幅影象的大小和型別必須一致 2018/10/26 10:08
import cv2
import numpy as np

x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x, y))  # 250+10 = 260 => 255 因為最大值為255
print(x + y)  # 250+10 = 260 %                                     = 4
"""
結果分析:
    對兩幅影象進行加法時候會更加明顯。OpenCV的結果會更好點。所以我們儘量使用OpenCV中的函式
"""
# 第二小節 影象的混合 cv2.addWeighted() 2018/10/26 10:10
"""
前提:
    這其實也是加法,但是不同的是兩幅影象的權重不同,就會給人一種混合或者透明的感覺。影象混合的計算公式如下:
    g (x) = (1−α)f0 (x) + αf1 (x)
    so 我們可以通過修改α的值(0--->1),可以實現非常酷的混合
    dst = α·img1 + β ·img2 + γ
    這裡的α取值為0
"""
import cv2
import numpy as np

img1 = cv2.imread('./image/image0.5858483461472451')
img2 = cv2.imread('./img01.jpg')

dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
"""
結果分析:
    必須是兩張影象大小一致的不然會報錯的。
"""
# 第三小節 按位運算 2018/10/26 10:26
"""
前提:
    按位操作有: AND,OR,NOT,XOR等.當我們提取影象的一部分,選擇非矩形ROI時 這些操作會很有用
目的:
    我想把OpenCV的標誌放在另一幅影象上.如果我們是用加法顏色會改變,如果使用混合,會得到透明效果,但是我不想要透明.
"""
import cv2
import numpy as np

img1 = cv2.imread('./66.jpg')  # 讀取圖片
img2 = cv2.imread('./OpenCV.jpg')
rows, cols, channels = img2.shape  # 獲取圖片的長和高(行數 和 列數)
roi = img1[0:rows, 0:cols]  # 擷取圖片一的位置大小
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # 進行圖片二顏色的修改 print(img2gray.shape) 從結果來看 是一個灰度圖
ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)  # 轉化為灰度圖
mask_inv = cv2.bitwise_not(mask)  # 灰度圖的相反 白變黑 黑變白
img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)
dst = cv2.add(img1_bg, img2_fg)  # 把兩個圖片合成一個圖
img1[0:rows, 0:cols] = dst  # 然後去替代大圖中的位置

cv2.imshow('res', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

"""
結果分析:
    第一 方法的介紹和使用:
        cv2.imread()圖片的讀入
        cv2.cvtColor() 空間顏色的轉換,一般用這個多是轉換為灰度圖的.
        cv2.threshold() 他的用法是ret,dst = cv2.threshold(src, thresh, maxval, type) 
            src: 輸入圖,只能為單通道影象,通常來說為灰度圖
            dst: 輸出圖
            thresh: 閾值
            maxval: 當畫素值超過閾值(或者小於閾值,根據type來決定),所賦予的值
            type: 二值化操作的型別,包含一下5種類型:  cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
            作用:
                畫素高於閾值時,給畫素賦予新值,否則,賦予另外一種顏色。函式是cv2.threshold() 返回值retval其實就是閾值 
        cv2.bitwise_not() 圖片效果反轉 一般傳入的多為灰度圖片 白色變成黑色 黑色變成白色
        cv2.bitwise_and() 計算兩個陣列或陣列和標量的每元素逐位連線。cv2.bitwise_and( src1,src2 [,dst [,mask ] ] )
            引數:	
                src1 - 第一個輸入陣列或標量。
                src2 - 第二個輸入陣列或標量。
                dst - 與輸入陣列具有相同大小和型別的輸出陣列。
                mask - 可選操作掩碼,8位單通道陣列,指定要更改的輸出陣列的元素。
"""

總結: 應該有些解釋很牽強 這只是我個人的理解 後期的學習中肯定會認識到現在自己所寫的註釋有毛病 請你們不要參考 我只是記錄我自己的學習筆記而已.