#LậpBảnĐồTiếnVàLùi #SựKiệnNgàyHômNay
Trong bài viết này, chúng ta sẽ tiếp tục khám phá về quy trình ánh xạ chuyển tiếp trong thị giác máy tính. Đây là một phương pháp được sử dụng để chuyển đổi hình ảnh từ tọa độ ban đầu sang tọa độ mới. Quy trình này đã được đề cập đến trong phần giới thiệu và bài viết trước đó.
Để ánh xạ chuyển tiếp hình ảnh, chúng ta cần xác định một hàm nhận các tham số là tọa độ ban đầu của pixel. Hàm này sẽ áp dụng phép biến đổi và trả về tọa độ mới của pixel sau khi chuyển đổi. Chúng ta có thể sử dụng các phép biến đổi khác nhau như xoay, thu phóng, tịnh tiến, vv.
Một ví dụ cụ thể về chức năng chuyển đổi xoay được đưa ra trong mã nguồn trên. Hàm `apply_transformation` sẽ áp dụng phép biến đổi xoay vào tọa độ pixel ban đầu và trả về tọa độ mới sau khi chuyển đổi. Các tọa độ mới sẽ được làm tròn đến giá trị pixel gần nhất bằng cách sử dụng hàm `np.rint`.
Sau khi có chức năng chuyển đổi, chúng ta có thể lặp lại từng pixel của hình ảnh gốc, áp dụng phép biến đổi và kiểm tra xem tọa độ mới của pixel có nằm trong miền của hình ảnh gốc hay không. Nếu tọa độ mới nằm trong miền, pixel tại tọa độ mới của hình ảnh mới sẽ có giá trị giống với pixel gốc tương ứng. Ngược lại, nếu tọa độ mới nằm ngoài hình ảnh, pixel sẽ bị bỏ qua.
Để minh họa quá trình áp dụng phép biến đổi xoay theo chiều, chúng ta có thể xem kết quả trong ảnh bên phải. Bên trái là hình ảnh gốc, bên phải là hình ảnh đã được chuyển đổi.
Tuy nhiên, cần lưu ý rằng các hình ảnh chuyển đổi không hoàn toàn giống với hình ảnh gốc vì các vấn đề như pixel trung gian không nhận giá trị và chồng chéo. Các pixel trung gian không nhận giá trị do quá trình làm tròn tọa độ mới. Trong trường hợp này, các pixel không được cung cấp giá trị trong quá trình chuyển đổi, vì vậy chúng sẽ có màu trắng. Mặt khác, chồng chéo xảy ra khi hai pixel của ảnh gốc ánh xạ tới cùng một pixel của ảnh mới. Trong mã nguồn được sử dụng trong bài viết này, giá trị của pixel mới sẽ được ghi đè lên giá trị pixel gốc cuối cùng đã được chuyển đổi.
Đó là khái quát về quy trình ánh xạ chuyển tiếp cho thị giác máy tính. Hy vọng rằng bài viết đã giúp bạn hiểu rõ hơn về cách áp dụng các phép biến đổi lên hình ảnh và các vấn đề có thể phát sinh trong quá trình chuyển đổi.
bản tin
Sed ut perspiciatis unde.
Quy trình ánh xạ chuyển tiếp bao gồm quy trình chuyển đổi hình ảnh đơn giản đã được thảo luận trong phần giới thiệu và trong bài viết trước: quy trình này lặp lại trên tất cả các pixel của hình ảnh và quy trình chuyển đổi tương ứng được áp dụng cho từng pixel riêng lẻ. Tuy nhiên, những trường hợp trong đó vị trí mới của pixel được chuyển đổi nằm ngoài miền hình ảnh, ví dụ về trường hợp được hiển thị bên dưới, phải được tính đến.
Để thực hiện quá trình ánh xạ chuyển tiếp, trước tiên hãy xác định một hàm nhận các tham số là tọa độ ban đầu của pixel. Hàm này sẽ áp dụng phép biến đổi cho tọa độ pixel gốc và trả về tọa độ mới của pixel sau khi chuyển đổi. Ví dụ mã sau đây cho thấy chức năng chuyển đổi xoay.
def apply_transformation(original_x: int, original_y: int) -> Tuple(int, int):
# Define the rotation matrix
rotate_transformation = np.array(((np.cos(np.pi/4), -np.sin(np.pi/4), 0),
(np.sin(np.pi/4), np.cos(np.pi/4), 0),
(0, 0, 1)))
# Apply transformation after setting homogenous coordinate to 1 for the original vector.
new_coordinates = rotate_transformation @ np.array((original_x, original_y, 1)).T
# Round the new coordinates to the nearest pixel
return int(np.rint(new_coordinates(0))), int(np.rint(new_coordinates(1)))
Khi bạn có chức năng này, bạn chỉ cần lặp lại từng pixel của hình ảnh, áp dụng phép biến đổi và kiểm tra xem tọa độ pixel mới có nằm trong miền của hình ảnh gốc hay không. Nếu tọa độ mới nằm trong miền, pixel trên tọa độ mới của hình ảnh mới sẽ lấy giá trị mà pixel gốc có trong hình ảnh gốc. Nếu nó nằm ngoài hình ảnh, pixel sẽ bị bỏ qua.
def forward_mapping(original_image: np.ndarray) -> np.ndarray:
# Create the new image with same shape as the original one
new_image = np.zeros_like(original_image)
for original_y in range(original_image.shape(1)):
for original_x in range(original_image.shape(0)):
# Apply rotation on the original pixel's coordinates
new_x, new_y = apply_transformation(original_x, original_y)
# Check if new coordinates fall inside the image's domain
if 0 <= new_y < new_image.shape(1) and 0 <= new_x < new_image.shape(0):
new_image(new_x, new_y, :) = original_image(original_x, original_y, :)return new_image
Kết quả của việc áp dụng phép biến đổi xoay với ánh xạ theo chiều có thể được nhìn thấy trong ảnh bên dưới, trong đó bên trái là ảnh gốc và bên phải là ảnh đã biến đổi. Điều quan trọng cần lưu ý là đối với hình ảnh này, gốc tọa độ nằm ở góc trên bên trái, vì vậy hình ảnh xoay quanh điểm đó ngược chiều kim đồng hồ.
Về kết quả của việc chuyển đổi, có thể thấy hình ảnh được chuyển đổi không có nền đen hoàn toàn như hình gốc mà thay vào đó là nhiều sọc trắng. Điều này xảy ra, như đã đề cập trong phần giới thiệu, bởi vì các pixel của ảnh gốc không phải lúc nào cũng ánh xạ tới tất cả các pixel của ảnh mới. Vì các tọa độ mới được tính bằng cách làm tròn đến pixel gần nhất, điều này dẫn đến nhiều pixel trung gian không bao giờ nhận được giá trị. Trong trường hợp này, vì hình ảnh mới được khởi tạo với tất cả các pixel trống, nên các pixel chưa được cung cấp giá trị trong quá trình chuyển đổi sẽ vẫn trống, tạo ra các sọc trắng đó trong hình ảnh đã chuyển đổi.
Ngoài ra, cần lưu ý rằng có một vấn đề đáng chú ý khác: chồng chéo. Sự cố này xảy ra khi hai pixel của ảnh gốc được chuyển thành cùng một pixel của ảnh mới. Đối với mã được sử dụng trong bài viết này, nếu có hai pixel của ảnh gốc ánh xạ tới cùng một pixel của ảnh mới, thì pixel mới sẽ lấy giá trị của pixel gốc cuối cùng đã được chuyển đổi, ghi đè lên giá trị của cái đầu tiên đã được thiết lập.
[ad_2]