iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 17
0
影片教學

用Django架構建置專屬的LINEBOT吧系列 第 17

[Day 17]用Django架構建置專屬的LINEBOT吧 - 圖像運算(I)

前幾篇都講到了關於OPENCV當中幾個常用的函數,
實際上有太多可以使用的圖像處理方法了,
之後再專門做一集跟大家講解這部分的內容(老高上身?)
今天介紹一些關於圖像的運算方法,
關於圖像運算的部分,
主要是可以在圖像處理當中做到更細微的處理,

關於圖像的基礎運算概念

圖像的基礎運算當中,
當然也不外乎加減乘除的四則運算,
在圖像處理的基礎篇有提到,基本上圖片對電腦而言,
尤其是OPENCV在圖片讀取時,是以0-255的8位元數值去表示的,
因此許多圖片運算也都會被侷限在這個範圍內,
例如某個像素的灰階值為127,如果我希望對該像素進行增亮的處理,
以一般加法來說,如果我增加200,那麼超過255時,
數值將會變成(200+127)%256=71,
結果反而還比原來的灰階值更低了,
所以OPENCV在圖像運算上有自己的玩法,
以下直接用python的檔案跟大家做幾個範例介紹:

影像加法cv2.add()

在上面提到的範例,如果我們希望讓一個圖片增加某個定值的話,
可以使用cv2.add()的方法,讓兩個矩陣數值相加,
實際範例的做法如下:

#image_calculator.py
from cv2 import cv2 as cv 
import numpy as np

image_path = './test.png'

img = cv.imread(image_path,0)
print(img)
img2 = np.ones(img.shape,dtype=np.uint8)*30
print(img2)
img3 = cv.add(img,img2)
print(img3)

cv.imwrite('./img.png',img)
cv.imwrite('./img2.png',img2)
cv.imwrite('./img3.png',img3)

其中test.png是在圖片基礎篇使用的,
在測試的時候也可以嘗試使用別的圖片來進行cv2.add()的加法運算,

結果圖如下:
https://ithelp.ithome.com.tw/upload/images/20201002/20121176jCY1jY8IWp.jpg

上面是用單通道的影像進行運作的結果,
如果以實際的圖片案例,大概會是這個樣子:

https://ithelp.ithome.com.tw/upload/images/20201002/20121176EANzKHOEYj.pnghttps://ithelp.ithome.com.tw/upload/images/20201002/20121176KyIW3dUGp2.png

可以看到圖片明顯亮了一階(全部像素值+100的效果),

cv2.add函數也可以讓兩張圖片進行相加的動作,

譬如這兩張圖片:
https://ithelp.ithome.com.tw/upload/images/20201002/20121176xpoEqkepdB.jpghttps://ithelp.ithome.com.tw/upload/images/20201002/20121176L8y9j7sGjU.jpg

首先他們都是225x225像素大小的圖片,
同樣使用cv2.add()的方式將兩張圖片相加,

img = cv.imread('./Mcdonald.jpg')
img2 = cv.imread('./burgerking.jpg')
img3 = cv.add(img,img2)

cv.imwrite('./img.png',img)
cv.imwrite('./img2.png',img2)
cv.imwrite('./img3.png',img3)

cv2.add(img,img2)所得到的結果圖如下:
https://ithelp.ithome.com.tw/upload/images/20201002/20121176IsxhnEdzXy.png

其中白色底圖的部分,依然是全白的,
但是在原來藍色的logo部分,又再加上了紅色的數值,
因此顏色外觀呈現粉紅色,而其中也能隱隱約約看到橘色的M,

透過設計,
我們也能夠讓LINEBOT使用者嘗試將兩張圖片合併成一張並回傳結果,
這樣就能讓更多有趣的設計透過圖片合成被創造出來囉~

影像加權和cv2.addWeghted()

最後再帶到關於影像加權和的一個用法,
cv2.add()是將兩個圖片相加合成第三張圖片,
cv2.addWeighted()則是將兩張照片依不同佔比進行合成,
以上面兩個餐飲業龍頭的logo為例:

img = cv.imread('./Mcdonald.jpg')
img2 = cv.imread('./burgerking.jpg')
img3 = cv.addWeighted(img,0.8,img2,0.2,0)

cv.imwrite('./img.png',img)
cv.imwrite('./img2.png',img2)
cv.imwrite('./img3.png',img3)

https://ithelp.ithome.com.tw/upload/images/20201002/20121176WpLsjt2wkA.png

這樣一來兩張圖就能夠按照比例被顯示在一個畫面當中了,

以上就是針對圖片數值相加的一個範例,
明天將繼續影像運算的其他部分


上一篇
[Day 16]用Django架構建置專屬的LINEBOT吧 - 輪廓(Contour)(IV)
下一篇
[Day 18]用Django架構建置專屬的LINEBOT吧 - 圖像運算(II)
系列文
用Django架構建置專屬的LINEBOT吧30

尚未有邦友留言

立即登入留言