Blogs

Giới Thiệu Giải Thuật Sift Là Gì, Giới Thiệu Giải Thuật Sift Để Nhận Dạng Ảnh

Bạn đang quan tâm đến Giới Thiệu Giải Thuật Sift Là Gì, Giới Thiệu Giải Thuật Sift Để Nhận Dạng Ảnh phải không? Nào hãy cùng VCCIDATA đón xem bài viết này ngay sau đây nhé, vì nó vô cùng thú vị và hay đấy!

XEM VIDEO Giới Thiệu Giải Thuật Sift Là Gì, Giới Thiệu Giải Thuật Sift Để Nhận Dạng Ảnh tại đây.

I. SIFT là gì ?

Tiếp nối chuỗi bài viết về các phương pháp trong xử lý ảnh, hôm nay mình xin giới thiệu tới các bạn về phương pháp trích chon đặc trưng SIFT. SIFT (Scale-invariant feature transform) là một feature descriptor được sử dụng trong computer vision và xử lý hình ảnh được dùng để nhận dạng đối tượng, matching image, hay áp dụng cho các bài toán phân loại…

*

4×4 Gradient windowHIstogram of 4×4 samples per window in 8 directionsGaussian weighting around center4x4x8 = 128 dimensional feature vector Đặc điểm :Các keypoint sẽ ít bị phụ thuộc bởi cường độ sáng, nhiễu, góc xoay của ảnh do các descriptor được tạo ra từ gradients do đó nó đã bất biến với các thay đổi về độ sáng (ví dụ: thêm 10 vào tất cả các pixel hình ảnh sẽ mang lại cùng một mô tả chính xác).Nhanh và hiệu quả, tốc độ xử lý gần như với thời gian thực (realtime)Có thể xử lý khi xoay ảnh

II. Áp dụng SIFT cho bài toán phân loại

Để khởi tạo đối tượng SIFT trong OpenCV ta sử dụng lệnh: sift = cv2.xfeatures2d.SIFT_create()

img = cv2.imread(“path_to_image”) #đọc ảnhimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # chuyển ảnh sang hệ graysift = cv2.xfeatures2d.SIFT_create() #khởi tạo đối tượng siftkp, des = sift.detectAndCompute(img,None) #Đối tượng này có phương thức detectAndCompute trả về 2 outputs kp và des, kp là một list chứa các keypoints được detect bởi SIFT, des là một numpy array chứa len(kp) vectors 128 chiều.print(des.shape) img=cv2.drawKeypoints(gray,kp,img)cv2.imwrite(“path_to_image”,img) #lưu ảnh

*

Áp dụng cho bài toán phân loại:

XEM THÊM:  Cách Hack Thẻ Tín Dụng Bị Lấy Cắp Như Thế Nào? Tôm Càng Đỏ

def read_data(path_to_image): X = <> #chứa image Y = <> #chứa label for label in os.listdir(“path_to_image”): for img_file in os.listdir(os.path.join(“path_to_image”, label)): img = load_image(os.path.join(“trainingset”, label, img_file)) X.append(img) Y.append(label2id

Đang xem: Sift là gì

Xem thêm: Bố Mẹ Nào Có Con Học Trường Tiểu Học Yên Hòa Có Tốt Không, Chọn Trường Tiểu Học Tốt Quận Cầu Giấy Cho Con

Trong phạm vi bài viết này thì mình sẽ sử dụng SIFT

def extract_sift_features(X): image_descriptors = <> sift = cv2.xfeatures2d.SIFT_create() for i in range(len(X)): _, des = sift.detectAndCompute(X, None) image_descriptors.append(des) return image_descriptors Hàm kmeans_bow() nhận đầu vào là một list gồm tất cả các descriptors của các ảnh trong tập X và số cụm num_clusters, sử dụng thuật toán KMeans trong scikit-learn phân cụm các vector descriptors này thành num_clusters cụm. Hàm trả về một danh sách center của các cụm. Vì thao tác này mất rất nhiều thời gian nên ta sẽ lưu danh sách trả về bởi hàm kmeans_bow() ra một file nhị phân.import timedef kmeans_bow(image_descriptors, num_clusters): strar = time.time() bow_dict = <> kmeans = KMeans(n_clusters=num_clusters, n_jobs = -1, verbose = 1).fit(all_descriptors) bow_dict = kmeans.cluster_centers_ print(“process time: “, time.time() – start) return bow_dictnum_clusters = 50if not os.path.isfile(“bow_dictionary.pkl”): BoW = kmeans_bow(all_descriptors, num_clusters) pickle.dump(BoW, open(“bow_dictionary.pkl”, “wb”))else: BoW = pickle.load(open(“bow_dictionary.pkl”, “rb”))Xây dựng hàm create_features_bow() nhận đầu vào là list image_descriptors, list BoW và num_clusters ở trên, trả về list X_features, trong đó phần tử thứ p của X_vectors là vector đặc trưng theo mô hình BoW ứng với ảnh thứ p, tập keypoint descriptors thứ p. Hãy chú ý sự tương ứng các phần tử trong 4 danh sách: X, Y, image_descriptors, X_features.

XEM THÊM:  Nuôi Cá Betta Bằng Cám Tomboy Có Tốt Không, Giá Bán Cám Tomboy

def create_features_bow(image_descriptors, BoW, num_clusters): X_features = <> for i in range(len(image_descriptors)): features = np.array(<0> * num_clusters) if image_descriptors is not None: distance = cdist(image_descriptors, BoW) argmin = np.argmin(distance, axis=1) for j in argmin: features += 1 X_features.append(features) return X_featuresX_features = create_features_bow(image_descriptors, BoW, num_clusters)Sau khi có X_feature chúng ta sẽ đưa vào các mô hình phân loại là xong. Các bạn có thể tham khảo các mô hình phân loại SVM.

Xem thêm: Phân Biệt Thẻ Tín Dụng Khác Thẻ Thanh Toán, Phân Biệt Thẻ Ghi Nợ Và Thẻ Tín Dụng

Tài liệu tham khảo

Bài viết trên được mình tổng hợp khi mình tham gia học lớp của thầy Đinh Viết Sang – giảng viên trường Đại học Bách Khoa Hà Nội và một số tài liệu mình tham khảo dưới đây:

Computer Vision: Algorithms and Applications, 2010 by Richard SzeliskThư viện OpenCVCảm ơn các bạn đã theo dõi bài viết của mình.

Vậy là đến đây bài viết về Giới Thiệu Giải Thuật Sift Là Gì, Giới Thiệu Giải Thuật Sift Để Nhận Dạng Ảnh đã dừng lại rồi. Hy vọng bạn luôn theo dõi và đọc những bài viết hay của chúng tôi trên website VCCIDATA.COM.VN

Chúc các bạn luôn gặt hái nhiều thành công trong cuộc sống!

Related Articles

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Back to top button