OpenCV圖像處理 - 為圖像添加Logo

1藻三,目的

將logo圖標(biāo)疊加到一張圖片的右上角梁沧,要求有顏色的區(qū)域?yàn)椴煌该髌鹛瑁鐚⒗镉皹I(yè)的Logo疊加到戰(zhàn)狼2的海報上柜与,原始圖和效果圖如下。

wolf.jpg
ali-movie.png
img_target.png

2悄蕾,思路

不同的logo有不同的處理方法票顾,有的是黑色需要透明,有的是白色需要透明帆调,但是奠骄,整理的思路是一致的。

如下圖所示番刊,從上向下含鳞,對要形成的效果進(jìn)行分解,一共分為3層芹务。

  • 第一層需要第二層的兩張圖片蝉绷,做cv2.add運(yùn)算即可
  • 第二層第一張圖片需要第三層前兩張圖片,做cv2.bitwise_and運(yùn)算即可枣抱,后一張做mask
  • 第二層第二張圖片需要第三層后兩張圖片熔吗,做cv2.bitwise_and運(yùn)算即可,后一張做mask
method of img deal.png

在分解過程中佳晶,需要思考和明確要調(diào)用的OpenCV函數(shù)桅狠。如果一步解決不了,就拆分成多步解決轿秧。

3中跌,步驟分析

基于上述思路,制定詳細(xì)的圖像處理步驟淤刃,并進(jìn)行編碼調(diào)試晒他。處理步驟如下圖所示。

ali-logo deal process.png

3.1逸贾,讀取logo圖片陨仅,并對logo按照20%進(jìn)行縮放

img_logo = cv2.imread("d:/1/ali-movie.png", cv2.IMREAD_COLOR)
img_logo = cv2.resize(img_logo, (0, 0), fx=0.2, fy=0.2, interpolation=cv2.INTER_NEAREST)

3.2津滞,對logo進(jìn)行灰度化處理,得到兩個mask

img_logo_gray = cv2.cvtColor(img_logo, cv2.COLOR_BGR2GRAY)
ret, img_logo_mask = cv2.threshold(img_logo_gray, 200, 255, cv2.THRESH_BINARY)  # 二值化函數(shù)
img_logo_mask1 = cv2.bitwise_not(img_logo_mask)

3.3灼伤,提取目標(biāo)圖片的ROI

img_target = cv2.imread("d:/1/wolf.jpg", cv2.IMREAD_COLOR)
rows, cols, channel = img_logo.shape
rows1, cols1, channel1 = img_target.shape
img_roi = img_target[:rows, cols1 - cols:cols1].copy()

3.4触徐,ROI和Logo圖像融合

img_res0 = cv2.bitwise_and(img_roi, img_roi, mask=img_logo_mask)
img_res1 = cv2.bitwise_and(img_logo, img_logo, mask=img_logo_mask1)
img_res2 = cv2.add(img_res0, img_res1)
# img_res2 = img_res0 + img_res1
img_target[:rows, cols1 - cols:cols1] = img_res2[:, :]
cv2.imwrite("img_target.png", img_target)

4,疑難點(diǎn)介紹

4.1狐赡,cv2.add與矩陣相加的區(qū)別

測試程序

import numpy as np
import cv2
x = np.uint8([250])
y = np.uint8([10])
print cv2.add(x,y)   #輸出# [[255]]
print x+y            #輸出# [4]  (250+10)%255

測試結(jié)論

  • cv2.add方法和numpy矩陣相加撞鹉,都可以完成兩張圖片的相加運(yùn)算
  • numpy矩陣相加是模運(yùn)算
  • cv2.add是滲透運(yùn)算,如果元素之和大于255颖侄,則按照255返回鸟雏,可以直接相加兩張圖片試試效果,代碼和效果圖如下所示
img_logo = cv2.imread("d:/1/ali-movie.png", cv2.IMREAD_COLOR)
img_target = cv2.imread("d:/1/wolf.jpg", cv2.IMREAD_COLOR)
print img_logo.shape, img_target.shape
img_new_add = cv2.add(img_target[:516, :798], img_logo[:516, :798])
cv2.imshow("img_new_add", img_new_add)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.add.png

4.2览祖,matplotlib的subplot簡單介紹

代碼如下孝鹊,效果圖如method of img deal.png所示。

  • 代碼
# 顯示圖片展蒂,調(diào)用matplotlib展示
plt.figure()
plt.subplot(332), plt.imshow(img_convert(img_res2), cmap='gray'), plt.title("img_res2")
plt.subplot(323), plt.imshow(img_convert(img_res0), cmap='gray'), plt.title("img_res0")
plt.subplot(324), plt.imshow(img_convert(img_res1), cmap='gray'), plt.title("img_res1")
plt.subplot(3, 4, 9), plt.imshow(img_convert(img_roi), cmap='gray'), plt.title("img_roi")
plt.subplot(3, 4, 10), plt.imshow(img_convert(img_logo_mask), cmap='gray'), plt.title("img_logo_mask")
plt.subplot(3, 4, 11), plt.imshow(img_convert(img_logo), cmap='gray'), plt.title("img_logo")
plt.subplot(3, 4, 12), plt.imshow(img_convert(img_logo_mask1), cmap='gray'), plt.title("img_logo_mask1")
plt.show()
  • 效果圖
method of img deal.png

5又活,源碼奉上

# coding:utf8

import numpy as np
import cv2
from matplotlib import pyplot as plt


# 圖像處理,將logo圖標(biāo)疊加到一張圖片的右上角锰悼,要求有顏色的區(qū)域?yàn)椴煌该?def img_deal():
    # 1柳骄,對logo進(jìn)行縮放,按照20%進(jìn)行
    img_logo = cv2.imread("d:/1/ali-movie.png", cv2.IMREAD_COLOR)
    img_logo = cv2.resize(img_logo, (0, 0), fx=0.2, fy=0.2, interpolation=cv2.INTER_NEAREST)
    # cv2.imshow("img_logo", img_logo)

    # 2箕般,對logo做清洗耐薯,白色區(qū)域是255,其他區(qū)域置為黑色0
    img_logo_gray = cv2.cvtColor(img_logo, cv2.COLOR_BGR2GRAY)
    ret, img_logo_mask = cv2.threshold(img_logo_gray, 200, 255, cv2.THRESH_BINARY)  # 二值化函數(shù)
    img_logo_mask1 = cv2.bitwise_not(img_logo_mask)
    # cv2.imshow("img_logo_gray", img_logo_gray)
    # cv2.imshow("img_logo_mask", img_logo_mask)

    # 3隘世,提取目標(biāo)圖片的ROI
    img_target = cv2.imread("d:/1/wolf.jpg", cv2.IMREAD_COLOR)
    rows, cols, channel = img_logo.shape
    rows1, cols1, channel1 = img_target.shape
    img_roi = img_target[:rows, cols1 - cols:cols1].copy()
    # cv2.imshow("img_roi", img_roi)

    # 4可柿,ROI和Logo圖像融合
    img_res0 = cv2.bitwise_and(img_roi, img_roi, mask=img_logo_mask)
    img_res1 = cv2.bitwise_and(img_logo, img_logo, mask=img_logo_mask1)
    img_res2 = cv2.add(img_res0, img_res1)
    # img_res2 = img_res0 + img_res1
    img_target[:rows, cols1 - cols:cols1] = img_res2[:, :]
    cv2.imwrite("img_target.png", img_target)

    # 顯示圖片,調(diào)用opencv展示
    # cv2.imshow("img_res0", img_res0)
    # cv2.imshow("img_res1", img_res1)
    # cv2.imshow("img_res2", img_res2)
    # cv2.imshow("img_target", img_target)
    # cv2.waitKey(0)
    # cv2.destroyAllWindows()

    # 顯示圖片丙者,調(diào)用matplotlib展示
    plt.figure()
    titles = ["img_logo", "img_logo_gray", "img_logo_mask", "img_logo_mask1", "img_roi", "img_res0", "img_res1",
              "img_res2"]
    imgs = [img_logo, img_logo_gray, img_logo_mask, img_logo_mask1, img_roi, img_res0, img_res1, img_res2]
    for x in xrange(len(imgs)):
        plt.subplot(241 + x), plt.imshow(img_convert(imgs[x]), cmap='gray'), plt.title(titles[x])  # , plt.axis('off')
    plt.show()

    # 顯示圖片,調(diào)用matplotlib展示
    plt.figure()
    plt.subplot(332), plt.imshow(img_convert(img_res2), cmap='gray'), plt.title("img_res2")
    plt.subplot(323), plt.imshow(img_convert(img_res0), cmap='gray'), plt.title("img_res0")
    plt.subplot(324), plt.imshow(img_convert(img_res1), cmap='gray'), plt.title("img_res1")
    plt.subplot(3, 4, 9), plt.imshow(img_convert(img_roi), cmap='gray'), plt.title("img_roi")
    plt.subplot(3, 4, 10), plt.imshow(img_convert(img_logo_mask), cmap='gray'), plt.title("img_logo_mask")
    plt.subplot(3, 4, 11), plt.imshow(img_convert(img_logo), cmap='gray'), plt.title("img_logo")
    plt.subplot(3, 4, 12), plt.imshow(img_convert(img_logo_mask1), cmap='gray'), plt.title("img_logo_mask1")
    plt.show()


# cv2與matplotlib的圖像轉(zhuǎn)換营密,cv2是bgr格式械媒,matplotlib是rgb格式
def img_convert(cv2_img):
    # 灰度圖片直接返回
    if len(cv2_img.shape) == 2:
        return cv2_img
    # 3通道的BGR圖片
    elif len(cv2_img.shape) == 3 and cv2_img.shape[2] == 3:
        b, g, r = cv2.split(cv2_img)
        return cv2.merge((r, g, b))
    # 4通道的BGR圖片
    elif len(cv2_img.shape) == 3 and cv2_img.shape[2] == 4:
        b, g, r, a = cv2.split(cv2_img)
        return cv2.merge((r, g, b, a))
    # 未知圖片格式
    else:
        return cv2_img


# 主函數(shù)
if __name__ == "__main__":
    img_deal()

6,參考頁面

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末评汰,一起剝皮案震驚了整個濱河市纷捞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌被去,老刑警劉巖主儡,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惨缆,居然都是意外死亡糜值,警方通過查閱死者的電腦和手機(jī)丰捷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寂汇,“玉大人病往,你說我怎么就攤上這事〗景辏” “怎么了停巷?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長榕栏。 經(jīng)常有香客問我畔勤,道長,這世上最難降的妖魔是什么扒磁? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任硼被,我火速辦了婚禮,結(jié)果婚禮上渗磅,老公的妹妹穿的比我還像新娘嚷硫。我一直安慰自己,他們只是感情好始鱼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布仔掸。 她就那樣靜靜地躺著,像睡著了一般医清。 火紅的嫁衣襯著肌膚如雪起暮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天会烙,我揣著相機(jī)與錄音负懦,去河邊找鬼。 笑死柏腻,一個胖子當(dāng)著我的面吹牛纸厉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播五嫂,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颗品,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沃缘?” 一聲冷哼從身側(cè)響起躯枢,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎槐臀,沒想到半個月后锄蹂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡水慨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年得糜,在試婚紗的時候發(fā)現(xiàn)自己被綠了敬扛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掀亩,死狀恐怖舔哪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情槽棍,我是刑警寧澤捉蚤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站炼七,受9級特大地震影響缆巧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豌拙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一陕悬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧按傅,春花似錦捉超、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至况芒,卻和暖如春惜纸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绝骚。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工耐版, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人压汪。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓粪牲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛾魄。 傳聞我的和親對象是個殘疾皇子虑瀑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容