問(wèn)題:使用opencv給圖片加logo時(shí),發(fā)現(xiàn)logo文字的邊緣有很多鋸齒。
需求:消除鋸齒,使圖像更加平滑
情況一:圖片本身就有鋸齒
需要做的是圖片平滑處理,中值濾波,高斯濾波(圖片會(huì)變模糊),網(wǎng)上也有很多相關(guān)資料。(大家可以試試)
情況二:沒(méi)有讀取png圖片的alpha通道,導(dǎo)致半透明的像素顯示為透明,產(chǎn)生鋸齒
處理方法:加水印的時(shí)候,每個(gè)像素去融合。(opencv的addWeighted方法只支持3通道的融合)
效果圖:
背景圖尺寸要大于logo尺寸文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-518654.html
import cv2
import numpy as np
tImg = cv2.imread("./img.png")
logo = cv2.imread("./img_0.png", cv2.IMREAD_UNCHANGED)
lgRows, lgCols, _ = logo.shape
lx = ly = 100
maxAl = 255
# 合并兩個(gè)像素點(diǎn)的RGB
def mergePoint(px1, px2):
dst = [0]*(len(px1))
if (px2[3] == 0):
return px1
elif (px2[3] == 255):
return px2[:3]
else:
for i in range(len(px1)):
dst[i] = int(px1[i] * (maxAl - px2[3]) /
maxAl + px2[i] * (px2[3]/maxAl))
return np.array(dst)
dst = [[[0 for c in range(3)]
for c in range(lgCols)]for r in range(lgRows)]
dst = np.array(dst)
# 獲取roi區(qū)域(需要做融合的長(zhǎng)寬區(qū)域)
logoRoi = tImg[:lgRows, :lgCols]
for r in range(lgRows):
for c in range(lgCols):
dst[r][c] = np.array([0, 0, 0])
dst[r][c] = mergePoint(logoRoi[r][c], logo[r][c])
tImg[:lgRows, :lgCols] = dst
cv2.imshow("merge", tImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
exit()
在網(wǎng)上沒(méi)搜到類似的解法,做一個(gè)記錄,大家有更好的方法,希望一起交流~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-518654.html
到了這里,關(guān)于python opencv png鋸齒處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!