有關 D9 的 SIFT 實作,為什麼RGB Channel 的三張圖片看起來位置、顏色、底圖都一樣呢?
我想請教前輩2個問題:
1. 我不知道是不是理解錯誤,雖然可以看出灰階跟 RGB Channel 特徵圖不相同,但是我做出來 RGB Channel 的三張圖片看起來位置、顏色、底圖都一樣,這樣是否是錯誤的?(程式碼在最下面)
2. 為什麼 lena 圖做出來的特徵點看起來一樣大,且沒有方向性?建築這張圖片卻很明顯呢?
# Appendix
```
import numpy as np
import cv2
# !pip install opencv-contrib-python
from matplotlib import pyplot as plt
img = cv2.imread('data/lena.png')
# 轉灰階圖片
# img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 建立 SIFT 物件
SIFT_detector_0 = cv2.SIFT_create()
SIFT_detector_1 = cv2.SIFT_create()
SIFT_detector_2 = cv2.SIFT_create()
# 取得 SIFT 關鍵點位置
keypoints_0 = SIFT_detector_0.detect(img[..., 0], None)
keypoints_1 = SIFT_detector_1.detect(img[..., 1], None)
keypoints_2 = SIFT_detector_2.detect(img[..., 2], None)
# 畫圖 + 顯示圖片
img_show_0 = cv2.drawKeypoints(img[..., 0], keypoints_0, img)
img_show_1 = cv2.drawKeypoints(img[..., 1], keypoints_1, img)
img_show_2 = cv2.drawKeypoints(img[..., 2], keypoints_2, img)
img_show = np.hstack((img_show_0, img_show_1, img_show_2))
# plt.figure(dpi=160)
# plt.imshow(cv2.cvtColor(img_show, cv2.COLOR_BGR2RGB))
while True:
cv2.imshow('SIFT', img_show)
k = cv2.waitKey(0)
if k == 27:
cv2.destroyAllWindows()
break
```
回答列表
-
2020/10/23 下午 03:25Paul贊同數:0不贊同數:0留言數:0
特徵點大小和方向性,在cv2.drawKeypoints 加 flag
img_show_0 = cv2.drawKeypoints(img[..., 0], keypoints_0, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
img_show_1 = cv2.drawKeypoints(img[..., 1], keypoints_1, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
img_show_2 = cv2.drawKeypoints(img[..., 2], keypoints_2, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
至於為何完全一樣,我認為SIFT對顏色並不敏感,只對幾何形狀有興趣
-
2020/11/27 下午 00:41Jeffrey贊同數:0不贊同數:0留言數:0
1. SIFT 主要是求取局部的極值來做特徵, 對於尺度, 色階(顏色變化), 十分鈍化, 所以, 會發現人像圖變化不大> 2. 建築圖則是因為特徵與背景凸顯在形狀的差異, 3. 可以參照 https://zh.wikipedia.org/zh-tw/%E5%B0%BA%E5%BA%A6%E4%B8%8D%E8%AE%8A%E7%89%B9%E5%BE%B5%E8%BD%89%E6%8F%9B