图像为什么能相加
我們知道2個矩陣是可以執行加法運算的,那2個圖像能不能相加呢?當然是可以的。前面提到,圖像就是函數,函數可以相加,圖像當然也可以相加。
我們知道2個矩陣相加必須是同一維度的,即行列相同,圖像當然也一樣,即寬度和高度相同。
我們看下面2副圖像:
輸出結果:
(576, 720) (576, 720)可以看出,這2副圖像的寬度和高度分別是720和576,大小是一致的。2個圖像相加就是2個矩陣相加。
unite = boats + goldhill cv2.imshow("unite", unite) cv2.waitKey()輸出結果:
不怎么樣嘛!白塊,黑塊怎么那么多!有的地方變白了,有的地方變黑了。what’s wrong?
我們知道,圖像的強度取值區間是[0, 255],opencv的圖像類型是uint8類型。而numpy的矩陣加法是一種模(mod)操作,即200+60=260 % 256 = 4,所以該亮的地方反而暗淡了。
opencv自帶有圖像加法操作運算函數:add(x, y)。add使用的是飽和操作,即200+60=260->255。所以使用opencv自帶的add()函數效果會更好。
另外,2副圖像相加,我們實際上需要的2副圖像相對位置強度的平均值,因此在相加前,需要各除以2,然后再相加(注意要整除)。
unite = cv2.add(boats // 2 , goldhill // 2) cv2.imshow("unite", unite) cv2.waitKey()我們知道,除以2和乘以0.5是等價的。乘以0.5是一個數乘運算,也就是說,圖像自身還可以進行這種運算(注意乘以浮點數后矩陣類型發生了改變,而opencv的圖像矩陣必須轉換成為uint8類型才能正常顯示)。
boats20 = 0.2 * boats boats20 = boats20.astype("uint8") cv2.imshow("boats20", boats20) cv2.waitKey()輸出結果:
可以看到,整體效果暗淡了很多。因為所有的像素點的值都乘以了0.2,強度變成了原來的20%。如果乘的數值小于1,圖像整體就變暗,如果乘的數值大于1,整體就變亮。
這給了我們混合2張圖像的一種比率調和方法,例如最前面2張圖,我們想要看到更多的船(注意為確保2張圖像的混合值小于255,系數之和應保持等于1)。
unite = 0.75 * boats + 0.25 * goldhill unite = unite.astype("uint8") cv2.imshow("unite", unite) cv2.waitKey()當然,opencv已經為我們準備好了函數addWeighted
()。代碼如下,效果是一樣的。
那么:圖像為什么要相加呢?為了混合(blend)2張圖像。
實質上,圖像相加還有一個用途:降噪。同一場景的不同時間采集圖像通過相加平均后去除噪聲,這個后面再講。
總結