python + opencv 第六節 圖像的基本操作

# 1.獲取並修改像素值
import cv2
import numpy as np

img = cv2.imread('salary.jpg')
# 獲取座標爲 [100, 100]點的像素
px = img[100, 100] # 返回 [B, G, R]
print(type(px))
print(px)
blue = img[100, 100, 2]# 獲取座標爲[100, 100]的 R(對應值爲2)的值,(B對應0, G對應1)
print(type(blue))
print(blue)

#修改像素值
#img[100, 100] = [255, 255, 255] #一個點塗白
#img[100] = [255, 255, 255] #可以看到在圖像上畫了一條白線 水平方向
#img[:, 100] = [255, 255, 255] #可以看到在圖像上花了一條白線,垂直方向  第一維(行)取全部,第二維(列)取 100 處
#img[:] = [255, 255, 255] #整個圖像塗白
print(type(img))


#修改像素值方法2: 用到 Numpy 的 array.item
# print(type(img.item(10, 10, 2)))
# print(img[10, 10])
# print(img.item(10, 10, 0))
# img.itemset((10,10,2),100)
# print(img.item(10,10,2))

# 2.獲取圖像屬性
# 行, 列, 通道, 圖像數據類型等等
print(img.ndim) # 獲取維度  輸出 3
print(img.shape) #獲取圖像的高,寬,和通道數  輸出 : (640, 1024, 3)
print(img.dtype) #獲取圖像數據類型  輸出 : uint8

# 3.圖像 ROI 感興趣區域

# roi_1 = img[100:300, 500:550] # 選取感興趣區域  100:300 是x軸200的距離,500:550是y軸50的距離
# img[300:500, 700:750] = roi_1 # 將ROI拷貝到另一區域,這裏注意x軸和y軸的距離要保持一致才能拷貝

# 4. 爲圖像擴邊
# def copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None)
# src : 源圖
# top, bottom, left, right : 上下左右邊界向外擴充邊緣的大小
# borderType : 要添加哪種類型的邊界
#         BORDER_REPLICATE  # 複製邊界像素,重複最後一個元素  aaaaaa|abcdefgh|hhhhhhh
#         BORDER_REFLECT    # 鏡像 fedcba|abcdefgh|hgfedcb
#         BORDER_REFLECT_101 # 對稱法,以最邊緣像素爲軸,對稱 gfedcb|abcdefgh|gfedcba 對稱法和鏡像法的差別就在最邊緣的像素,對稱法不鏡像最邊緣像素,鏡像法包含最邊緣的像素
#         BORDER_WRAP       # 將圖像的左邊拷貝到右邊的邊緣,右邊拷貝到左邊的邊緣  cdefgh|abcdefgh|abcdefg
#         BORDER_CONSTANT   # 添加有顏色的常數值邊界 需要使用參數value
# value 邊界顏色,如果邊界的類型是 cv2.BORDER_CONSTANT,則需要用到這個參數

# replicate_ = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_REPLICATE)
# cv2.namedWindow('replicate')
# cv2.imshow('replicate', replicate_)

# reflect_ = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_REFLECT)
# cv2.namedWindow('reflect')
# cv2.imshow('reflect', reflect_)

# wrap_ = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_WRAP)
# cv2.namedWindow('wrap')
# cv2.imshow('wrap', wrap_)

# constant_ = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value = [255, 0, 0])
# cv2.namedWindow('constant_')
# cv2.imshow('constant_', constant_)

# 5. 圖像混合 (可以產生透明的效果)
# def addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
# 按照公式 : dst = α · img1 + β · img2 + γ 混合
# α + β = 1
# gamma : 一個加到權重總和上的標量值,效果有點類似曝光度
# 注意 : 混合的兩張圖片,一定要大小一樣

# img1 = cv2.imread('1024_663_fengyelu.jpg')
# img2 = cv2.imread('1024_663_lvshuiqingshan.jpg')
#
# dst = cv2.addWeighted(img1, 0.5, img2, 0.5, 200)
#
# cv2.namedWindow('混合後圖像')
# cv2.imshow('混合後圖像', dst)

# cv2.namedWindow('salary')
# cv2.imshow('salary', img)

logo1 = cv2.imread('opencv.jpg')
rows, cols, channel = logo1.shape
roi_logo = img[0:rows, 0:cols]

# def threshold(src, thresh, maxval, type, dst=None)
# 作用是將一幅灰度圖二值化
# src : 源圖像 要是灰度圖
# thresh : 閾值
# maxval : 最大值 一般設置255
# type :
#         cv2.THRESH_BINARY:超過閾值的像素設置爲maxVal,不超過的設置爲0
#         cv2.THRESH_BINARY_INV:不超過閾值的設置爲maxVal,超過的設置爲0
#         cv2.THRESH_TOZERO:低於閾值的設置爲0
#         cv2.THRESH_TOZERO_INV:低於閾值的設置爲maxVal
#         cv2.THRESH_TRUNC:超過閾值的設置爲maxval

# threshold函數有兩個返回值,其中第二個返回值(這裏是mask)是二值化後的灰度圖。
# 當我們指定了閾值參數thresh,第一個返回值ret就是我們指定的thresh.換句話說,我們可以不指定閾值參數thresh。

logo2gray = cv2.cvtColor(logo1, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(logo2gray, 10, 255, cv2.THRESH_BINARY)
print(ret)
mask_inv = cv2.bitwise_not(mask)

img1_bg = cv2.bitwise_and(roi_logo, roi_logo, mask = mask_inv)

img2_bg = cv2.bitwise_and(logo1, logo1, mask = mask)

dst = cv2.add(img1_bg, img1_bg)
img[0:rows, 0:cols] = dst

cv2.imshow('res', img)


k = cv2.waitKey(0)
if k == 27:
    cv2.destroyAllWindows()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章