OpenCV有相當多的函數可以進行幾何變換,但真的要用起來,實在不方便。故本篇將其常用的功能集合成一個類別,改寫成一個好用的sdk – class MahalCv
縮放
cv2.resize(src, (新寬, 新高), 內插值方式)
內插值有如下三種
cv2.INTER_AREA
cv2.INTER_CUBIC(三次插值)
cv2.INTER_LINEAR(線性插值)
cv2.INTER_NEAREST(最近鄰插值)
cv2.INTER_LANCZOS4(lANCZOS插值)
以上的插值法都是為了解決放大縮小時失真的問題,有著非常複雜的演算法。但常用的就二種,CUBIC(速度較慢)及LINEAR(速度較快)
from MahalSdk import MahalSdk as cv
import pylab as plt
img = cv.read("1.jpg")
img = cv.resize(img, width=400)
plt.imshow(img[:,:,::-1])
print(img.shape)
plt.show()
sdk代碼如下
影像裁切
想要取得影像中的某個區塊,可直接指定列及行。請注意,numpy的第一維為列,第二維為行,第三維為bgr值
平移
cv2.warpAffine(src, m, (新尺寸))
m 為平移參數。[1, 0. 500] 為水平平移,[0,1,500]為垂直平移
新尺寸為tuple型態, 是整個影像裁切後的尺寸,不是縮放後的尺寸,所以一般都是原始長寬。最後才使用resize縮放。

旋轉
cv2.getRotationMatrix2D((中心x, 中心y), 角度, 縮放)

鏡射

透視圖(Prespective)
透視圖可以將非水平或非垂直的線拉直,如下圖所示

底下程式中,先選取原圖的四個點產生pts1陣列,其順序如上圖所示,依序為左上,右上,左下,右下。其座標為(x, y)。然後再選取要貼上的四個點pts2, 然後用getPerspectiveTransform()產生變換矩陣M, 再使用warpPerspective產生結果。

多張影像相加
若有多張影像要合成一張,則要考慮是前面蓋掉後面,或是每張都有其權重。多張影像相疊在一起可以使用cv2.addWeighted()函數。另需注意,每張影像的長寬皆必需一樣,才可以相加。底下是採用權重相加的效果

上述addWeighted()的最後一個參數,為亮度,0為不變,愈大就愈接近白色(255)
np及cv2的相加,有所不一樣,請看如下代碼
x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x,y)) #會得到最高上限值 255
print(x+y) # 會得到除以256後的餘數
結果 :
[[255]]
[4]
從網路下載圖片
從網路上下載圖片, 需使用 urllib套件。此套件系統本身就有了,不需另行安裝。
經由 urllib 讀入的 byte,使用 np.asarray() 變成陣列,就是檔案的原始格式,然後再使用 cv2.imdecode() 解壓縮即可得到完整的 numpy 格式圖片。
cv2 to Pillow
使用 Image.fromarray() 可以將 cv2 格式轉成 Pillow 格式
Pillow to cv2
使用 np.asarray() 可以將 Pillow 格式轉成 cv2 格式
