一.ROI切割
????????類似裁剪圖片,但是原理是基于Numpy數組的切片操作(ROI數組切片是會修改原圖數據的),也就是說這個“裁剪”不是為了保存“裁剪”部分,而是為了方便修改等處理。
import cv2 as cv
import numpy as npimg = cv.imread('../images/demo.png')# 前面是height,后面是width
roi = img[70:380, 81:450]cv.imshow('Original', img)
cv.imshow('ROI', roi)
cv.waitKey(0)
cv.destroyAllWindows()
二.圖像添加水印
????????也將一張圖片中的某個物體或者圖案提取出來,然后疊加到另一張圖片上。通過將原始圖片轉換成灰度圖,并進行二值化處理,得到一個類似掩膜的圖像。
????????簡要來講,就是得到一個目標區域大小的黑背景白logo掩膜(獲取logo顏色),和一個白背景黑logo掩膜(獲取背景顏色),然后兩個分別對logo原圖和目標區域進行與運算,然后處理后的兩個圖做飽和運算,就可以得到有顏色有背景的圖了。
2.1 模板輸入
????????就是包含水印的圖片,先灰度化后二值化(分別用閾值法和反向閾值法),這就得到了白色logo黑背景的掩膜和黑logo白色背景的掩膜。
import cv2 as cv
import numpy as npimg = cv.imread('../images/ymb3.jpg')# 進行灰度轉化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 二值化(閾值法),后續獲取原logo顏色
_, binary = cv.threshold(gray, 250, 255, cv.THRESH_BINARY)
# 二值化(反閾值法),后續獲取目標區域背景色
_, binary_inv = cv.threshold(gray, 250, 255, cv.THRESH_BINARY_INV)# 顯示圖像
cv.imshow('binary', binary)
cv.imshow('binary_inv', binary_inv)
cv.waitKey(0)
cv.destroyAllWindows()
2.2 與運算
????????根據掩膜的大小切割出一個ROI區域,也就是我們要添加水印的區域,之后讓其與模板的兩個掩膜進行與運算,就可以得到有logo黑背景和黑logo有目標區域背景的掩膜。
import cv2 as cv
import numpy as nplogo = cv.imread('../images/ymb3.jpg')
sy = cv.resize(logo, (150, 150))
img = cv.imread('../images/lvbo.png')# 進行灰度轉化
gray = cv.cvtColor(sy, cv.COLOR_BGR2GRAY)# 二值化(閾值法),后續獲取原logo顏色
_, binary = cv.threshold(gray, 250, 255, cv.THRESH_BINARY)
# 二值化(反閾值法),后續獲取目標區域背景色
_, binary_inv = cv.threshold(gray, 250, 255, cv.THRESH_BINARY_INV)# ROI區域提取,先獲取掩膜大小
print(binary.shape)
print(img.shape)# 從目標圖想要加入水印的地方切片一個相同大小的區域
roi = img[100:250, 100:250]# 掩膜與目標圖進行與運算,獲取目標圖中ROI區域的背景色
bg = cv.bitwise_and(roi, roi, mask=binary)# 掩膜與logo進行與運算,獲取logo中的水印色
wm = cv.bitwise_and(sy, sy, mask=binary_inv)# 顯示圖像
cv.imshow('b', binary)
cv.imshow('bi', binary_inv)
cv.imshow('sy', sy)
cv.imshow('bg', bg)
cv.imshow('wm', wm)
cv.waitKey(0)
cv.destroyAllWindows()
(150, 150)
(626, 1075, 3)
2.3 圖像融合
目的就是將圖像對應的數組中的對應元素進行相加
????????就是opencv兩張圖相加,飽和運算就是加數值,黑色的區域是0,加5就是5,所以就可以替換黑色變成有顏色的部分。
????????或者使用 OpenCV 的 cv.addWeighted() 方法可以將兩張圖片按權重進行混合。通過調整權重參數,可以控制水印的透明度。
# 合并logo水印與背景色
dst = cv.add(bg, wm)# 將融合圖像插入目標圖中
img[100:250, 100:250] = dst
cv.imshow('re', dst)
cv.imshow('result', img)
cv.waitKey(0)
cv.destroyAllWindows()
我這里是因為圖片里面很多顏色像白色,所以效果沒有特別好。