You are on page 1of 22

Đại học Quốc gia Hà Nội

Trường Đại học Khoa học Tự nhiên


-----***-----

BÁO CÁO CUỐI KỲ HỌC PHẦN TÍNH TOÁN SONG SONG

Bone Fracture Detection on X-ray image


using Canny Edge Detection algorithm
based on Multiprocessing

Giảng viên : Thầy Trần Hà Nguyên


Thành viên nhóm : Nguyễn Thị Ngọc Anh
Nguyễn Thị Hằng
Vũ Yến Hoa
Phan Diệu Linh

Hà Nội - 2023
I. Introduction
Trên thực tế, phương pháp chụp X-quang được sử dụng phổ biến trong
lĩnh vực y tế để chẩn đoán gãy xương hoặc phân loại gãy xương. Phương pháp
thủ công này thường mất thời gian và có thể có sai sót do kết quả của sự chẩn
đoán này chỉ dựa trên ý kiến chủ quan của 1 bác sĩ và con người thì không phải
hoàn hảo, luôn có những sai lầm. Gãy xương có thể đơn giản là do tai nạn hoặc
do những căn bệnh khác. Do đó, chẩn đoán kịp thời và chính xác là rất cần thiết
cho bất kỳ phương pháp mới nào được đưa ra. Bên cạnh đó, có những vết rạn
nứt xương rất nhỏ hoặc các xương nằm nông và chỗ xương sụn mà trên phim X
- quang không thể nhìn rõ được.
Chính vì vậy, việc sử dụng công nghệ hiện đại để cải thiện tốc độ cũng
như độ chính xác hỗ trợ cho bác sĩ trong quá trình khám chữa bệnh là một ứng
dụng đang phổ biến hiện nay. Về cơ bản, bài báo này phân tích và so sánh các
phương pháp tính toán khác nhau sử dụng thuật toán Phát hiện cạnh Canny dựa
trên thời gian chạy thuật toán với dữ liệu là ảnh chụp X-quang. Trên thực tế, đã
có 1 số phương pháp trong y khoa được dùng để cải thiện chất lượng và khắc
phục điểm yếu của ảnh X-quang như phương pháp chụp siêu âm với đề tài đã
được công bố "Giải pháp ứng dụng kỹ thuật siêu âm chẩn đoán gãy xương sườn
và sụn sườn trong chấn thương ngực kín”.Tuy nhiên trong bài báo này, chúng
tôi muốn đề cập đến phương pháp sử dụng công nghệ khoa học, tuy chúng tôi
chưa thể xây dựng thành công một mô hình có thể tự chẩn đoán ra vị trí rạn,gãy
xương nhưng bài báo cáo này sẽ là một trong những nền móng cơ bản cho hệ
thống y tế kỹ thuật cao sau này.

II. Related Work


● Một vài phương pháp tính toán song song dùng trên thuật toán Canny
Detector mà chúng tôi tìm hiểu được bao gồm:
1. Tính toán song song với CUDA C++:
- Trước tiên, ta cấp phát bộ nhớ trên GPU cho ảnh đầu vào và
đầu ra. Sau khi mỗi kernel được thực hiện, dữ liệu sẽ được
sao chép từ GPU về CPU để làm đầu vào cho các bước tiếp
theo. Vì dữ liệu không thể trực tiếp truy cập từ GPU nên để
hiển thị hình ảnh, ta cần chép nó về bộ nhớ CPU.
- Thuật toán sử dụng lưới (grid) và khối(block) CUDA. Các
grid có kích thước tùy chỉnh theo hàm và mỗi block chỉ chứa
một thread. Mỗi thread sẽ xử lý một pixel và các thread này
thực hiện các phép toán độc lập trên ảnh. Do đó, toàn bộ ảnh
sẽ được xử lý đồng thời.
- Ưu điểm:
+ Tốc độ xử lý ảnh rất nhanh, dù là ảnh có kích cỡ nhỏ
hay lớn. Ví dụ, với ảnh 2048x2048, thời gian xử lý
xấp xỉ 3,5s ; với ảnh 300x300, thời gian xử lý xấp xỉ
1,1s.
- Nhược điểm:
+ Không phải cấu hình máy nào cũng có thể chạy được
vì yêu cầu cần chip NVIDIA, và cũng tuỳ phiên bản
NVIDIA mà cài đặt khác nhau.
+ Cần phải cài đặt Cuda và OpenCV rất phức tạp
+ Code khó hiểu
2. Tính toán song song với OpenMP:
- Đầu tiên, dữ liệu ảnh được chuyển thành dạng ma trận. Với
mỗi bước của thuật toán, tác giả viết các vòng lặp for lồng
nhau để tính toán trên các phần tử trong ma trận, tương ứng
với các pixel. Phương pháp song song là để #pragma omp
parallel for trước mỗi vòng lặp lồng nhau đó. Do vậy, với
mỗi bước, dữ liệu ảnh sẽ được phân bố vào các thread và
chạy song song với nhau. Hết một bước (hết vòng for) thì dữ
liệu sẽ được gộp lại, qua một vài câu lệnh và sẽ lại được
phân ra các ở bước tiếp theo. Điều này tương đương với việc
chia bức ảnh ra làm nhiều phần ở mỗi bước, mỗi phần được
xử lý trên một thread. Số thread ở các bước là như nhau và
tùy vào cài đặt của người dùng (mặc định = 8 hoặc có thể
dùng câu lệnh để thay đổi số thread).
- Điểm mạnh:
+ Giữ nguyên logic của code tuần tự -> dễ hiểu
+ Thời gian chạy nhanh (<2s để xử lý một ảnh với độ phân
giải HD)
+ Không bị quá tải dữ liệu
+ Dùng cpu nên có thể chạy trên mọi thiết bị
- Điểm yếu:
+ Viết bằng c++ nên khó cài đặt ngôn ngữ và các thư viện
+ Ngôn ngữ C++ khó sử dụng hơn

● Thuật toán mà nhóm chúng tôi lựa chọn là tính toán song song với
Multiprocessing của Python.
- Phương pháp Multiprocessing của Python đơn giản hơn nhiều so
với 2 phương pháp trên. Trong mỗi bước của thuật toán Canny,
hình ảnh sẽ được chia thành các phần nhỏ và các process đảm nhận
thực hiện tính toán đồng thời cho từng phần. Để đạt được hiệu quả
tốt nhất, trong bước một “Giảm nhiễu”, chúng ta dùng 3 process để
thực hiện đồng thời cho từng kênh màu RGB trong quá trình tính
toán tích chập; với bước 2 “Tính đạo hàm”,chúng ta sử dụng 2
process tính đồng thời dx và dy. Với các bước còn lại, số process
được sử dụng tuỳ thuộc vào số process chúng ta khai báo trong
code. Trong thí nghiệm của chúng tôi, số process khai báo là 8.
- Trong hai phương pháp được nêu ở trên, nhược điểm của chúng
đều là khó cài đặt và khó sử dụng, môi trường chạy không đồng
nhất vì còn phụ thuộc vào cấu hình máy. Tuy nhiên, đối với
phương pháp dùng Multiprocessing, chúng ta chỉ cần cài đặt và
import thư viện như thường lệ là có thể chạy được.
- Bên cạnh đó, điểm yếu lớn nhất của phương pháp này chính là về
thời gian thực thi. Do sử dụng ngôn ngữ lập trình thông dịch
Python nên tốc độ xử lý lâu hơn so với 2 phương pháp dùng ngôn
ngữ lập trình biên dịch C++. Bên cạnh đó, số process cần lựa chọn
phù hợp với hệ thống máy tính của ta, cụ thể là số lượng core vật lý
trên CPU. Nếu số lượng cores vật lý (physical cores) trên CPU của
ta là 6, thì việc đặt num_of_processes là 12 trong code của ta sẽ
không tận dụng tối đa hiệu suất của CPU. Điều này có thể gây ra
overhead và không cải thiện hiệu suất nếu số lượng processes vượt
quá số cores vật lý.
- Tuy vậy, bài toán của chúng tôi vẫn cần phải xử lý vấn đề về load
balance như sau: hiện tại bài toán của chúng tôi chia công việc
thành các phần có kích thước cố định. Chúng tôi đang hướng đến
việc sử dụng cấu trúc dữ liệu hàng đợi (queue) trong kỹ thuật
“Work stealing”. Với ý tưởng là cho phép process đã thực hiện
xong hàng đợi (queue) công việc của mình tìm các process khác có
hàng đợi không trống để “đánh cắp” công việc từ đầu hàng đợi.
Tuy nhiên, đến thời điểm làm bài báo cáo, chúng tôi chưa thực hiện
được ý tưởng này.

III. Method
1) Phương pháp tính toán tuần tự
Bước 1: Giảm nhiễu (Noise Reduction)

Trong bước này chúng ta sẽ thực hiện làm mờ ảnh đầu vào thông qua một ma
trận Gaussian Filter. Làm mờ ảnh đầu vào giúp chúng ta loại bỏ đi các chi tiết
thừa, không quan trọng trong các thành phần chính, yếu tố cơ bản của bức ảnh
đó.

Đầu tiên, chúng ta sẽ giới thiệu về bộ lọc Gauss

Bộ lọc này thực hiện bằng cách nhân chập ảnh đầu vào với một ma trận
lọc Gauss sau đó cộng chúng lại để tạo thành ảnh đầu ra

Ý tưởng: giá trị mỗi điểm ảnh sẽ phụ thuộc nhiều vào các điểm ảnh ở gần
hơn là các điểm ảnh ở xa. Trọng số của sự phụ thuộc được lấy theo hàm Gauss
(cũng được sử dụng trong quy luật phân phối chuẩn).

Để tính ma trận Gauss chúng ta sẽ sử dụng công thức sau đây:

Trong đó x và y là tọa độ theo 2 trục đứng và ngang còn σ là phương sai

Giả sử ta có kernel = 7 và sigma = 3 ta sẽ thu được ma trận sau


đây:
Sau đó, chúng ta sẽ thực hiện nhân tích chập của ma trận ảnh với ma trận gauss
trên thu được một ảnh đã được làm mờ như hình sau:
Bước 2: Tính đạo hàm của ảnh (Image Gradient)

Trong bước này chúng ta sẽ chuyển ảnh đầu vào thành một ảnh xám và thông
qua đặc trưng là cường độ và hướng của độ sáng để phát hiện cạnh.

Các cạnh tương ứng với sự thay đổi cường độ sáng của pixel. Để phát
hiện nó, cách dễ nhất là áp dụng các Filter làm nổi bật sự thay đổi cường độ này
theo cả hai hướng: ngang (x) và dọc (y)

Ở đây chúng ta sẽ sử dụng bộ lọc Sobel để thực hiện tìm cạnh theo
chiều ngang và chiều dọc ta có hai ma trận sobelX và sobelY tương ứng
như sau:

Và thực hiện tìm hướng cho mỗi pixel theo công thức:

Trong đó Iy và Ix là đạo hàm thu được sau khi nhân tích chập ảnh với ma
trận sobelX và sobelY
Sau bước này chúng ta sẽ thu được ảnh như sau:
Ở đây các cạnh gần như đã được tìm thấy nhưng tỉ lệ độ dày mỏng của các cạnh
không giống nhau nên chúng ta sẽ thực hiện một số bước bên dưới để loại bỏ
những pixel thừa

Bước 3: Loại bỏ cực đại (Non-maximum Suppression)

Trong bước này chúng ta sẽ sử dụng kết quả tìm độ lớn và cạnh của từng pixel
trong bước 2 để đánh giá xem nên loại bỏ một số cạnh cực đại hay không

Thuật toán trong bước này được thực hiện như sau:

Đối với mỗi pixel chúng ta sẽ xét 2 pixel bên cạnh nó theo hướng của pixel đó
(tìm được ở bước 2) giả sử ở đây xét pixel A theo hướng của đạo hàm ta tìm
được 2 pixel lân cận là pixel C và pixel B. Sau đó chúng ta sẽ xét đến độ lớn của
3 pixel này và chọn ra pixel có giá trị lớn nhất và 2 pixel còn lại sẽ bị loại bỏ.
Tức là chúng ta sẽ tạo ra một mảng chứa các giá trị pixel lớn nhất

Ở trong thuật toán này chúng ta sẽ chia 4 hướng (trái phải, trên dưới, phải trên
cùng và trái dưới cùng, trái trên cùng và phải dưới cùng) dựa vào góc của pixel
Giả sử xét một pixel (i , j) có độ lớn là v dưới đây:
Do hướng của pixel được xác định là trái phải nên ta có:

v1 = pixel(i, j + 1)

v2 = pixel(i, j – 1)

Sau đó xét v, v1, v2 ta thấy v2 có giá trị lớn nhất(về độ sáng) nên chúng ta sẽ
đưa v2 vào mảng chứa các pixel có giá trị lớn nhất.

Dựa vào mảng kết quả (mảng các pixel có giá trị lớn nhất) sẽ thu được ảnh như
sau:

Kết quả là cùng một hình ảnh với các cạnh mỏng hơn. Tuy nhiên, ta vẫn có thể
nhận thấy sự không đồng đều trong cường độ của các cạnh: một số pixel có vẻ
sáng hơn những pixel khác và điều này sẽ được khắc phục bằng bước tiếp theo.

Bước 4: Hysteresis Thresholding


Trong bước này chúng ta sẽ phân chia các pixel dựa trên 2 ngưỡng là: ngưỡng
thấp (low_ratio) và ngưỡng cao (high_ratio)

Thuật toán được sử dụng trong bước này như sau: Đầu tiên chúng ta sẽ xét độ
lớn (value) của các pixel:

- Nếu value > high_ratio → Thì pixel đó được đánh giá là pixel mạnh (gán
value = 255)

- Nếu value < low_ratio → Thì pixel đó được đánh giá là pixel yếu (gán value
= 0)

- Còn đối với low_ratio < value < high_ratio → Đối với pixel này ta sẽ xét các
pixel xung quanh nếu là pixel mạnh thì pixel này được giữ lại(gán value = 255)

Như vậy sau bước này chúng ta sẽ thu được ảnh như sau:
2) Phương pháp tính toán song song

Như phần trên đã đề cập đến thì chúng em sẽ sử dụng phương pháp song
song là Multiprocessing của Python.

Trong phần này sẽ nói cụ thể đến quá trình song song cho từng bước của
thuật toán Canny Edge Detector như thế nào.

Bước 1: Giảm nhiễu (Noise Reduction)

Như ở phần tuần tự đã đề cập thì trong bước này chúng ta sẽ sử dụng bộ
lọc Gaussian để làm mờ ảnh đầu vào. Ta biết rằng một bức ảnh thì được cấu
tạo bởi nhiều các pixel. Và mỗi pixel thì bao gồm 3 giá trị là (r,g,b) trong đó,
r: red, g: green, b:blue là 3 màu cơ bản cấu tạo nên tất cả các màu.

Nên trong bước làm mờ này để xử lý song song chúng ta sẽ tạo 3 process
để xử lý riêng cho mỗi màu.

Bước 2: Tính đạo hàm của ảnh (Image Gradient)

Trước khi tính toán đạo hàm chúng ta đã thực hiện chuyển ảnh sang màu xám,
tức là chỉ có một giá trị cường độ sáng nằm trong khoảng 0 đến 255 đặc trưng
cho ảnh.

Trong bước này chúng ta cần giải quyết 2 vấn đề:

- Tính đạo hàm của pixel theo chiều ngang (dx) và chiều dọc (dy)

- Tính độ lớn và hướng đạo hàm của mỗi pixel


Đối với vấn đề đầu tiên chúng ta sẽ tạo ra 2 process: một process sẽ thực hiện
nhiệm vụ tính đạo hàm của pixel theo chiều ngang và process còn lại sẽ thực
hiện tính theo chiều dọc

→ Sau bước này ảnh sẽ được làm nổi bật theo chiều ngang và chiều dọc

Còn đối với vấn đề 2 chúng ta sẽ sử dụng số process tối đa để quá trình
tính toán diễn ra nhanh nhất

Bước 3: Loại bỏ cực đại (Non-maximum Suppression)

Bước 4: Hysteresis Thresholding

Đối với cả bước 3 và bước 4 thì chúng ta cần tính toán và đưa ra các thay
đổi về độ sáng cho từng pixel để thu được ảnh phát hiện cạnh. Nên trong các
bước này số process cũng sẽ được sử dụng tối đa để thực hiện công việc tính
toán các giá trị độ sáng.

Như vậy đối với việc sử dụng phương pháp song song chúng ta sẽ tối ưu
hóa tốc độ tính toán các pixel của bức ảnh được đưa vào. Các pixel được tính
toán một cách song song với nhau chứ không cần phải tính lần lượt các pixel
như ở phương pháp tuần tự. Điều này sẽ giảm thiểu thời gian xử lý quá trình
phát hiện cạnh đặc biệt là đối với những ảnh với kích thước lớn.
3) Ứng dụng:
Chúng tôi xây dựng một ứng dụng bằng ReactJS để triển khai thuật
toán Phát hiện cạnh Canny với phương pháp tính toán song song
Multiprocessing Python.
Ứng dụng này cho phép người dùng tải lên hình ảnh từ máy và xuất
ra hình ảnh sau khi được tìm biên. Vì chất lượng mỗi ảnh là khác nhau,
nên cần điều chỉnh các thông số kernel size, low threshold và high
threshold phù hợp để xuất ra được ảnh biên tốt nhất. Do đó, chúng tôi
thêm tính năng cho phép người dùng tự nhập linh hoạt 3 tham số này. Sau
khi tải ảnh lên và chọn các options, người dùng sẽ ấn vào nút Detect Edge
để hệ thống của chúng tôi xử lý và xuất ra màn hình ảnh đã được tìm
biên, bên cạnh ảnh gốc để dễ dàng so sánh. Người dùng cũng có thể tải
ảnh biên về máy bằng cách chọn nút Download.
Chúng tôi cũng đang cải tiến hướng tới ứng dụng có thể tải và xử
lý nhiều ảnh cùng lúc, và kết quả in ra được từng bước của thuật toán tùy
vào lựa chọn của người dùng.

IV. Experiment
- Bộ dữ liệu được thu thập từ các nguồn ảnh X-quang trên google.
Chúng tôi chọn ra các ảnh có kích cỡ khác nhau để thử nghiệm về
thời gian chạy và dung lượng.

148 x 180 362 x 442 494 x 935


1100 x 716
1262 x 1536 1749 x 2077

- Bên cạnh đó, chúng tôi cũng chọn ra những hình ảnh X-quang có
vị trí gãy xương rất nhỏ hoặc vết nứt, lệch khó nhận ra bằng mắt
thường để kiểm chứng độ chính xác của thuật toán.

- Môi trường chạy:


+ Phần cứng: laptop ACER với số core CPU = 6, GPU
NVIDIA GTX 1650
+ Phần mềm: hệ điều hành Windows, ngôn ngữ lập trình
python, IDE Pycharm

1. So sánh với thuật toán tuần tự


- So với thuật toán tuần tự, phương pháp tính toán song song có ưu điểm về
thời gian thực thi. Đối với ảnh có kích thước nhỏ (dưới 1000) thì thời
gian chạy của 2 phương pháp không có chênh lệch quá lớn (xấp xỉ 10s).
Tuy nhiên, kích thước ảnh càng tăng, tốc độ thực thi của Multiprocessing
càng nhanh hơn, ví dụ với kích cỡ 1747x2077, chênh lệch này có thể lên
tới gấp hàng nghìn lần.
- Mặt khác, nếu xét về dung lượng khi chạy chương trình thì phương pháp
dùng Multiprocessing sẽ ít tốn bộ nhớ hơn vì bài toán của chúng tôi sử
dụng Shared Memory. Shared memory cho phép các worker processes
chia sẻ cùng một vùng bộ nhớ, giảm bớt việc sao chép dữ liệu giữa các
process.

2. So sánh với các phương pháp khác


- Về hai phương diện thời gian thực thi cũng như dung lượng thì hai
phương pháp Cuda C++ và OpenMP đều chiếm ưu thế hơn rất nhiều so
với Multiprocessing. Kích cỡ ảnh càng tăng, chênh lệch giữa chúng càng
rõ.

- Tuy nhiên, về mặt hiệu quả của thuật toán: hai phương pháp này đều cho
ra kết quả không chính xác như Multiprocessing. Các kết quả của
Multiprocessing cho ra kết quả với đường nét rõ ràng, cân đối, chỉ bị mất
nét hoặc thừa nét rất ít, do đó kết quả chẩn đoán gãy xương cũng khá
chính xác. Ngược lại, hai phương pháp kia cho kết quả bị mất nhiều nét
quan trọng, hoặc quá nhiều nét thừa, mặc dù chúng tôi dùng các chỉ số
giống nhau. Có thể cho rằng việc này là do phương pháp Cuda và
OpenMP được viết bằng C++, ngôn ngữ này xử lý dữ liệu ảnh (dưới dạng
ma trận) kém hiệu quả hơn Python, ngôn ngữ chúng tôi sử dụng trong
phương pháp Multiprocessing.

(1) (2)

(1) Kết quả của OpenMP

(2) Kết quả của Cuda C++

(3) Kết quả của Multiprocessing

(3)
V. Comment

Chúng tôi đã tiến hành đo số liệu trung bình về thời gian chạy và bộ nhớ sử
dụng khi thay đổi số process của thuật toán song song Multiprocessing, thể hiện
bằng biểu đồ trên. Có thể thấy bộ nhớ sử dụng trong quá trình chạy thuật toán
không thay đổi nhiều, lớn nhất là 90.5MB và nhỏ nhất là 88.6MB. Trái lại, thời
gian chạy có sự thay đổi nhỏ nhưng khá rõ ràng: giảm dần rồi giữ cân bằng, rồi
lại tăng lên khi tăng nhiều hơn 12 process. Cụ thể, khi thay đổi số process từ 1
lên 3, thời gian giảm từ 25.9 giây xuống chỉ còn 18.2 giây. Khi tăng số process
từ 12 lên 20, thời gian tăng từ 20.7 giây lên 30.16 giây. Điều này có thể được
giải thích rằng với số process phù hợp thì thuật toán sẽ chạy tốt nhất, chứ không
phải chia càng nhiều process càng tốt. Trong thử nghiệm này của chúng tôi, số
process tốt nhất nên được dùng trong khoảng từ 3 - 10 process để thuật toán đạt
hiệu quả tối đa.
Số process phù hợp như thế nào cũng tùy thuộc vào nhiều yếu tố, như cấu hình
của thiết bị, kích thước ảnh,... Chẳng hạn, chúng tôi đo sự khác biệt khi thay đổi
process ở bức hình có kích thước nhỏ hơn rất nhiều (140 x 180) và trên một
thiết bị có cấu hình thấp hơn:
Có thể thấy, khi tăng số process, thời gian chỉ càng tăng. Vậy số process phù
hợp nhất ở trường hợp này lại là 1. Giải thích phù hợp nhất cho việc này chính
là do kích thước ảnh quá nhỏ, việc chia thành nhiều process là không cần thiết,
trái lại còn tăng thêm số bước chạy của thuật toán, khiến thời gian tăng lên.

VI. Conclusion
Tóm lại, bài báo của chúng tôi đã đưa ra so sánh giữa các thuật toán cũng như
ưu nhược điểm của chúng, để từ đó chúng tôi lựa chọn dùng phương pháp
Multiprocessing để giải quyết bài toán. Chúng tôi áp dụng thuật toán này vào
việc làm hiện rõ vết thương cũng như vị trí tổn thương trên xương người dựa
vào ảnh X-quang. Tuy nhiên, không thể chối bỏ rằng phương pháp chúng tôi
dùng không phải là tối ưu và tốt nhất. Nó chỉ phù hợp cho những người mới bắt
đầu chưa có điều kiện đầu tư về thiết bị cũng như chưa có kiến thức chuyên sâu
về bộ môn này.

VII. Reference
1. Tatwamashi Panda, H. S.Pranavi Peddada, Annika Gupta, G. Kanimozhi
Indonesian Journal of Electrical Engineering and Informatics
(2022),10.52549/ijeei.v10i3.3776
2. VinBigData Canny-Phát hiện cạnh trong OpenCV,
https://vinbigdata.com/kham-pha/canny-phat-hien-canh-trong-opencv-hu
ong-dan-chi-tiet-tung-buoc.html

3. Canny-Edge-Detector-Multiprocessing
https://github.com/apanay20/Canny-Edge-Detector-Multiprocessing/blob/
main/Canny.py?fbclid=IwAR2W_8LvYTr87nZQ1HaOd3FrN3i6EcEq88i
OjKyTdoYtpG_mnZcE5XWvbuA#L16

4. Lesia I. Mochurad
Canny Edge Detection Analysis Based On Parallel Algorithm
Constructed Complexity Scale and CUDA, 2022
https://www.cai.sk/ojs/index.php/cai/article/view/2022_4_957

5. Sumit Gupta, Md. Altaf Hussain, Sagar Choudhury


Parallel Canny Gradient Edge Detector, 2023
https://github.com/Shubhamsareef/ParallelCannyGradientEdgeDetector

6. Ehsan Akbari Sekehravani, Eduard Babulak, Mehdi Masoodi


Implementing canny edge detection algorithm for noisy image, 2020
https://www.researchgate.net/publication/341051272_Implementing_cann
y_edge_detection_algorithm_for_noisy_image

7. Nancy Johari and Natthan Singh


BoneFracture Detection Using Edge Detection Technique, 2018
https://link.springer.com/chapter/10.1007/978-981-10-5699-4_2

8. Hindawi:
X-Ray Lung Image Classification Using a Canny Edge Detector, 2022
https://www.researchgate.net/publication/364866262_X-Ray_Lung_Imag
e_Classification_Using_a_Canny_Edge_Detector

9. Hope Mogale
High Performance Canny Edge Detector using Parallel Patterns for
Scalability on Modern Multicore Processors
https://arxiv.org/ftp/arxiv/papers/1710/1710.07745.pdf?fbclid=IwAR3em
1lstNLI4DSngm8evJpT7np63q4lF73wu3iSrwkpqygOoUUHbtjrYOE

You might also like