Tôi đang cố gắng tính toán bộ lọc sobel 3d trong python. Tôi có một mã thực sự hay cho hình ảnh 2D như bên dưới.
Nhân tiện. Hình ảnh gốc của tôi là loại uint8.
preSobel = preSobel.astype('int32')
dx = ndimage.sobel(preSobel, 0) # đạo hàm ngang
dy = ndimage.sobel(preSobel, 1) #đạo hàm dọc
mag = numpy.hypot(dx, dy) #độ lớn
mag *= 255.0 / numpy.max(mag) # chuẩn hóa (Hỏi đáp)
img[i,:,:]=mag
Nhưng theo ý kiến của tôi trang wiki Hiểu biết là để tính 2d, tôi nên nhân kết quả sobel 1d thay vì hypot :confused
Dù sao thì, để lên 3d, tôi nghĩ mình cần tính sobel 1d trên mỗi trục rồi nhân tất cả lên, nhưng tôi không chắc lắm... Có thư viện nào có thể tính sobel 3d nhanh hơn không?
Đầu tiên, trích dẫn của bạnliên kết wikipedia : Phép nhân ở đó đề cập đến cách xây dựng hạt tích chập sobel chứ không phải kết quả cuối cùng.
Đối với bộ lọc sobel 2D, bạn cần một hạt nhân để lấy đạo hàm theo hướng x và một hạt nhân khác để lấy đạo hàm theo hướng Y, ví dụ:
Về cơ bản, đây là công việc mà hai lệnh của bạn thực hiện, vì vậy nếu bạn đang sử dụng numpy thì bạn không cần phải tự xây dựng các hạt nhân này.
dx = ndimage.sobel(preSobel, 0) # đạo hàm ngang
dy = ndimage.sobel(preSobel, 1) #đạo hàm dọc
Bây giờ đối với trường hợp 3D, bạn cần 3 thao tác và 3 lõi, một cho dx, dy, dz. Phần wiki được liên kết sẽ cho bạn biết cách xây dựng hạt nhân bằng cách nhân các thành phần. Ví dụ: hạt nhân sobel đã hoàn thành của dZ là ma trận 3x3x3 như sau:
Để có được độ lớn, sau đó bạn vẫn phải lấy căn bậc hai của đạo hàm bình phương (cạnh huyền).
Tôi không có numpy nhưng theo như tôi biết the documentation Lệnh ndimage sobel có thể xử lý bất kỳ số lượng kích thước nào, do đó kernel đã cung cấp:
dx = ndimage.sobel(your3Dmatrix, 0) # x đạo hàm
dy = ndimage.sobel(your3Dmatrix, 1) # y đạo hàm
dz = ndimage.sobel(your3Dmatrix, 2) # z đạo hàm
Bây giờ lệnh cạnh huyền chỉ có thể lấy 2 tham số, vì vậy bạn phải tìm một cách khác để tính mag = sqrt(dx) một cách hiệu quảdx+dydy + dz*dz). Nhưng NumPy sẽ có mọi thứ bạn cần.
gia hạn
Thực tế, nếu bạn chỉ quan tâm đến độ lớn,có một chức năng hoàn chỉnh trong NumPy cho việc này :
mag = generic_gradient_magnitude(your3Dmatrix, sobel)
Tôi là một lập trình viên xuất sắc, rất giỏi!