幾何變換

      在〈幾何變換〉中尚無留言

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 格式

🔒 底下內容僅限會員閱讀。

立即登入

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *