我是OpenCV的新手。 我很樂意幫助我
我有一個像這樣的透明水印圖片
我想用python OpenCV在多張圖片的左下角打上水印
每張圖片都有不同的尺寸在放水印之前,我想調整水印的大小以適應圖片的大小,標志不應該被縮小或放大像這樣的影像:而這里是我的代碼:
import cv2
img1 = cv2.imread('my_image.png')
img2 = cv2.imread('my_watermark.png')
h, w = img1.shape[:2]
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
dst = cv2.add(img1_bg,img2_fg)
img1[0: rows, 0: cols] = dst
cv2.imwrite('imglogo.png', img1)
但是我對這個代碼有兩個問題
首先,水印位于圖片的右上角第二,水印失去了它的透明度并且影像變得像這樣。
我嘗試這樣做:
image = cv2.imread('my_image.png')
水印 = cv2.imread('my_watermark.png', cv2.IMREAD_UNCHANGED)
(wH, wW) = watermark.shape[:2]
weight = 1 - watermark[:, :, 3] / 255] 。
num1 = 1250] / 255
num2 = 50 50
image[num1:num1 wH, num2:num2 wW, 0] = np.multiply(image[num1:num1 wH, num2:num2 wW, 0], weight).astype(np.uint8)
image[num1:num1 wH, num2:num2 wW, 1] = np.multiply(image[num1:num1 wH, num2:num2 wW, 1], weight) .astype(np.uint8)
image[num1:num1 wH, num2:num2 wW, 2] = np.multiply(image[num1:num1 wH, num2:num2 wW, 2], weight).astype(np.uint8)
output = cv2. addWeighted(image[num1:num1 wH, num2:num2 wW], 1, watermark[:, :, 0: 3], 1, 1)
image[num1:num1 wH, num2:num2 wW] = output
cv2.imwrite("watermark3.png"/span>, image)
但是在不同的影像中,每個影像的大小會發生變化
因此,num1和num2必須改變。我有一點困惑。 我怎樣才能把水印放在多張圖片的左下角呢?
uj5u.com熱心網友回復:
你的問題中的最后一個代碼片段已經非常接近了。你的最終代碼大部分是有效的,你只需要概括一下水印所在的坐標。在圖片中,左上角的坐標是(0,0)。因此,如果你添加下面的代碼,你就可以計算出一個合適的坐標,將水印放在圖片的左下角:
(wH, wW) = watermark.shape[:2]
(iH, iW) = image.shape[:2]
border = 50 # 允許在影像的邊緣和水印的開始之間有一個50像素的邊界。
num1 = iH - (wH border)
num2 = border
這段代碼允許影像邊緣和水印開始之間有一個固定的50像素的邊界。你可能想使用//將其設定為影像尺寸的一部分,而不是這樣,你可能想使用不同的水平和垂直影像偏移。請注意,目前這段代碼假定你所有的圖片都比水印至少大50像素(水平和垂直)。我不確定你說的不調整水印的大小以適應圖片是什么意思。
如果你想把它放在影像的右下方,你只需:
num1 = iH - (wH border)
num2 = iW - (wW border)
你還問到如何在多個影像上進行操作。為此,你可以使用這個函式來創建一個檔案串列(把.jpg換成你實際使用的任何圖片格式):
import os
#Useful function[/span]。
def createFileList(myDir, format=' .jpg') 。
fileList = []
print(myDir)
for root, dirs, files in os.walk(myDir, topdown=False):
for name in files:
if name.endswith(format)。
fullName = os.path.join(root, name)
fileList.append(fullName)
return fileList
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/311673.html
標籤:
上一篇:將一個應用程式(地圖,分析師......等)從googleplay遷移到華為應用庫。
下一篇:不能匯入開放的cv模塊



