Mục lục:

Chẩn đoán tự động bệnh võng mạc tiểu đường qua MATLAB: 33 bước
Chẩn đoán tự động bệnh võng mạc tiểu đường qua MATLAB: 33 bước

Video: Chẩn đoán tự động bệnh võng mạc tiểu đường qua MATLAB: 33 bước

Video: Chẩn đoán tự động bệnh võng mạc tiểu đường qua MATLAB: 33 bước
Video: Bệnh lây truyền qua đường tình dục ở nam giới: Biết sớm, trị đúng! 2024, Tháng mười một
Anonim
Chẩn đoán tự động bệnh võng mạc tiểu đường qua MATLAB
Chẩn đoán tự động bệnh võng mạc tiểu đường qua MATLAB
Chẩn đoán tự động bệnh võng mạc tiểu đường qua MATLAB
Chẩn đoán tự động bệnh võng mạc tiểu đường qua MATLAB

(Xem đề cương mã ở trên)

Bệnh võng mạc tiểu đường là một bệnh về mắt liên quan đến tiểu đường do lượng đường trong máu cao. Lượng đường trong máu cao làm cho các mạch máu trong võng mạc sưng lên, dẫn đến các mạch máu mở rộng và thậm chí là rò rỉ mạch, dẫn đến các điểm tối trên hình ảnh võng mạc. Với mã này, chúng tôi hướng đến việc sử dụng sự xuất hiện của các điểm rò rỉ mạch máu như một dấu hiệu của bệnh võng mạc tiểu đường nền, mặc dù các kỹ thuật chẩn đoán sâu hơn sẽ được yêu cầu trong thế giới thực. Mục tiêu của mã này là tự động hóa quá trình xử lý hình ảnh và chẩn đoán hình ảnh võng mạc để xác định các dấu hiệu của bệnh võng mạc tiểu đường thể hiện qua các điểm tối trên hình ảnh võng mạc.

10 hình ảnh võng mạc bình thường và 10 hình ảnh võng mạc được chẩn đoán được xử lý thông qua một mã đầu tiên đọc và lọc hình ảnh, sau đó định lượng các điểm tối để xác định xem có các triệu chứng bệnh võng mạc tiểu đường hay không, dựa trên một ngưỡng nhất định. Kết quả sau đó được in ra cửa sổ lệnh để người xem giải thích.

Bước 1: Điều kiện tiên quyết

Điều kiện tiên quyết
Điều kiện tiên quyết

1. Đảm bảo rằng bạn đã tải xuống chương trình MATLAB trên máy tính của mình.

2. Tải xuống tệp txt có trong liên kết. (Nhấn ‘ctrl + s’ để lưu vào cùng thư mục với Mã MATLAB)

Bước 2: Điều kiện tiên quyết (không phải)

Điều kiện tiên quyết (không)
Điều kiện tiên quyết (không)
Điều kiện tiên quyết (không)
Điều kiện tiên quyết (không)

4. Mở MATLAB và gõ ‘uiimport’ vào cửa sổ lệnh.

5. Chọn tệp Officialdiagnoses.txt và nhập nó vào MATLAB dưới dạng ma trận ô.

6. Đảm bảo rằng bạn thấy ‘officialdiagnoses’ là một biến trong không gian làm việc.

Bước 3: Điều kiện tiên quyết (không phải)

Điều kiện tiên quyết (không)
Điều kiện tiên quyết (không)

7. Tải xuống hàm ModWald.m, có thể lấy từ mã trên hoặc tải xuống từ Canvas.

(Mã do Giáo sư King và Giáo sư Choi cung cấp)

Bước 4: Điều kiện tiên quyết (không phải)

Điều kiện tiên quyết (không)
Điều kiện tiên quyết (không)

8. Tải xuống 400 hình ảnh thô từ phần dữ liệu của Dự án STARE.

Bước 5: Dọn dẹp Matlab để chuẩn bị chạy mã

Dọn dẹp Matlab để chuẩn bị chạy mã
Dọn dẹp Matlab để chuẩn bị chạy mã

Thêm vào mã:

1. close all (Đóng tất cả các hình ảnh đã mở trước đó)

2. clearvars - ngoại trừ các chẩn đoán chính thức (Xóa tất cả các biến ngoại trừ tệp txt chẩn đoán chính thức được nhập trước đó)

3. cclc (Xóa cửa sổ lệnh)

Bước 6: Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường

Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường
Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường
Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường
Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường

1. Lấy tệp văn bản chẩn đoán và trích xuất tên hình ảnh. Những tên này được chứa trong cột đầu tiên của tệp văn bản, vì vậy để trích xuất chúng, hãy nhập 'officialdiagnoses (:, 1)'. Ma trận tên hình ảnh được gán cho một biến, “all_image_numbers”

2. Chuyển đổi biến all_image_numbers từ một mảng ô thành một mảng ma trận bằng cách sử dụng hàm cell2mat

Bước 7: Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường (không)

Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường (không)
Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường (không)
Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường (không)
Chọn 10 hình ảnh mắt bình thường và 10 hình ảnh có các triệu chứng bệnh võng mạc tiểu đường (không)

3. Chọn 10 ảnh mắt bình thường để chạy mã. Các hình ảnh được chọn trong trường hợp này là 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Đặt những con số này vào ma trận và gán chúng cho một biến sẽ được gọi khi tải hình ảnh.

4. Lặp lại bước 3 đối với hình ảnh võng mạc đã được chẩn đoán mắc bệnh võng mạc tiểu đường. Các hình ảnh được chọn trong trường hợp này là 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Bước 8: Tạo 2 biến (Bình thường và được chẩn đoán) và đặt mỗi biến bằng 0

Tạo 2 biến (bình thường và được chẩn đoán) và đặt chúng mỗi biến bằng 0
Tạo 2 biến (bình thường và được chẩn đoán) và đặt chúng mỗi biến bằng 0

Tạo các biến này trước vòng lặp for để khởi tạo các số của vòng lặp.

Bước 9: Tạo vòng lặp for để tự động tải lên hình ảnh bình thường

Tạo vòng lặp để tự động tải lên hình ảnh bình thường
Tạo vòng lặp để tự động tải lên hình ảnh bình thường

1. Tạo vòng lặp for

2. Đặt một biến đếm (trong trường hợp này là i) thành ma trận có các giá trị 1-10. Biến đếm này sẽ được sử dụng để gọi từng hình ảnh riêng lẻ

3. Lấy phần tử i trong ma trận ảnh để trích xuất và chuyển đổi tên ảnh từ chuỗi thành số bằng hàm num2str.

Tìm số chữ số có trong tên hình ảnh bằng cách sử dụng hàm numel. Gán giá trị này cho một biến, số_thông thường. Số này phải là 1 đối với các số có một chữ số, 2 đối với các số có hai chữ số và 3 đối với các số có ba chữ số. Thông tin này sẽ được sử dụng để tự động gọi hình ảnh.

Bước 10: Tạo vòng lặp for để tự động tải lên hình ảnh bình thường (không)

Tạo vòng lặp để tự động tải lên hình ảnh bình thường (không)
Tạo vòng lặp để tự động tải lên hình ảnh bình thường (không)

3. Tạo một câu lệnh if chứa cả ba khả năng từ các bước trước. Nếu tên hình ảnh có 1 chữ số, hình ảnh sẽ được gọi là “im000”, nếu nó có 2 chữ số, hình ảnh sẽ được gọi là “im00” và nếu nó có 3, hình ảnh sẽ được gọi là “im0”.

4. Dưới mỗi câu lệnh if, hãy gán một biến để imread “im” dưới câu lệnh if tương ứng với số lượng 0 thích hợp (như mô tả ở trên), theo sau là i.

Bước 11: Cắt các đường viền của hình ảnh

Cắt các đường viền của hình ảnh
Cắt các đường viền của hình ảnh

Lấy hình ảnh gốc và áp dụng bộ lọc imcrop để loại bỏ các đường viền màu đen và gán cho một I_crop biến. Hình chữ nhật cắt được chỉ định bằng ma trận [95, 95, 500, 410].

Bước 12: Tạo hình ảnh thang màu xám

Tạo hình ảnh tỷ lệ xám
Tạo hình ảnh tỷ lệ xám

Lấy hình ảnh đã cắt và áp dụng bộ lọc rbg2gray để thay đổi hình ảnh thành thang độ xám. Gán hình ảnh này cho biến I2.

Bước 13: Tạo hình ảnh tương phản

Tạo hình ảnh tương phản
Tạo hình ảnh tương phản

Lấy hình ảnh I2 và sử dụng imadjust để thay đổi tỷ lệ các giá trị cường độ.

Lấy các giá trị nằm trong phạm vi [0,2, 0,7] và bán lại chúng thành [0, 1]. Gamma được đặt thành 0,8 để làm cho hình ảnh sáng hơn. Gán hình ảnh mới cho I_adjusted.

Bước 14: Tăng cường hình ảnh tương phản

Nâng cao hình ảnh tương phản
Nâng cao hình ảnh tương phản

Chụp ảnh I_adjusted và sử dụng chức năng adapthisteq để tăng độ tương phản.

Cú pháp Adapthisteq yêu cầu tên hình ảnh, I_adjusted, ‘numTiles’, kích thước của numTiles, ‘nBins’ và số lượng thùng. Kích thước của numTiles được đặt thành [8 8], chia hình ảnh thành 8x8 ô và số thùng được đặt thành 28. Gán hình ảnh cho I_constrast.

Bước 15: Tạo bộ lọc trung bình

Tạo bộ lọc trung bình
Tạo bộ lọc trung bình

Tạo một biến có tên 'meanfilt' bằng cách sử dụng hàm fspecial. Nhập 'hàm trung bình' để tạo bộ lọc tính trung bình và chèn [90 90] cho kích thước cửa sổ trượt.

Bước 16: Kết hợp Bộ lọc Trung bình với Hình ảnh Tương phản

Kết hợp Bộ lọc Trung bình với Hình ảnh Tương phản
Kết hợp Bộ lọc Trung bình với Hình ảnh Tương phản

Tạo một biến mới có tên mask_mean và sử dụng hàm imfilter để lấy hình ảnh I_contrast và áp dụng bộ lọc trung bình đã tạo trước đó.

Bước 17: Tạo mặt nạ trung bình mới bằng cách trừ đi các điểm ảnh

Tạo mặt nạ ý nghĩa mới bằng cách trừ điểm ảnh
Tạo mặt nạ ý nghĩa mới bằng cách trừ điểm ảnh

Tạo một biến có tên mask_mean2 và sử dụng hàm imsubtract để trừ giá trị của mỗi pixel trong I_contrast khỏi pixel tương ứng trong mask_mean.

Bước 18: Tạo hình ảnh được lọc nhị phân

Tạo hình ảnh được lọc nhị phân
Tạo hình ảnh được lọc nhị phân

Chuyển hình ảnh từ thang độ xám sang màu đen và trắng bằng cách sử dụng tính năng thấm đẫm. Nhập mask_mean2, "thích ứng", "ForegroundPolarity", "tối", "Độ nhạy", 0,6. Gán hình ảnh mới này cho mask_binarize.

Bước 19: Loại bỏ các đốm màu nhỏ hơn được tìm thấy trong các hình ảnh được lọc

Loại bỏ các đốm màu nhỏ hơn được tìm thấy trong các hình ảnh được lọc
Loại bỏ các đốm màu nhỏ hơn được tìm thấy trong các hình ảnh được lọc

Loại bỏ các đối tượng có kết nối nhỏ hơn 100 pixel bằng cách sử dụng hàm bwareaopen trên mask_binarize và đặt giá trị ngưỡng thành 100. Gán biến là bw.

Bước 20: Tạo phần tử cấu trúc đĩa

Tạo phần tử cấu trúc đĩa
Tạo phần tử cấu trúc đĩa

Tạo một phần tử cấu trúc đĩa (với bán kính 2) bằng cách sử dụng hàm strel. Gán nó cho se.

Bước 21: Thực hiện các hoạt động đóng hình thái

Thực hiện các hoạt động đóng hình thái
Thực hiện các hoạt động đóng hình thái

Lấy bw và áp dụng hàm imclose cho phần tử cấu trúc để thực hiện thao tác đóng hình thái trên đối tượng.

Bước 22: Tìm các đối tượng có khả năng kết nối ít nhất là 8

Tìm các đối tượng có khả năng kết nối ít nhất 8
Tìm các đối tượng có khả năng kết nối ít nhất 8

Lấy bw và sử dụng bwconncomp để tìm các đối tượng có kết nối ít nhất là 8 trong hình ảnh. Gán đầu ra số cho cc_1.

Bước 23: Tìm số lượng điểm ảnh được kết nối tối đa

Tìm số lượng điểm ảnh được kết nối tối đa
Tìm số lượng điểm ảnh được kết nối tối đa
Tìm số lượng điểm ảnh được kết nối tối đa
Tìm số lượng điểm ảnh được kết nối tối đa

Sử dụng hàm cellfun để thực hiện hàm “numel” trên mọi ô trong CC. Thao tác này tìm số phần tử trong ô PixelIdxList. Gán Giá trị cho “numPixels”.

Tìm giá trị lớn nhất trong numPIxels. Gán giá trị tối đa lớn nhất cho “lớn nhất” và chỉ số của giá trị lớn nhất cho “idx”.

Bước 24: Đặt Giá trị điểm ảnh tối đa thành 0 và Tìm điểm ảnh bằng khả năng kết nối> = 26 Pixel

Loại bỏ các mạch máu trong hình ảnh
Loại bỏ các mạch máu trong hình ảnh

= 26 Kết nối Pixel "src =" https://content.instructables.com/ORIG/FXY/DTW3/JEOIIEL4/FXYDTW3JEOIIEL4-p.webp

Hình hiển thị
Hình hiển thị

= 26 Kết nối Pixel "src =" https://content.instructables.com/ORIG/FXO/GBX1/JEOIIELB/FXOGBX1JEOIIELB-p.webp

Loại bỏ các bình và đếm các đốm máu
Loại bỏ các bình và đếm các đốm máu

= 26 Khả năng kết nối Pixel "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300'%} ">

Chẩn đoán hình ảnh võng mạc dựa trên số lượng cục máu đông được xác định
Chẩn đoán hình ảnh võng mạc dựa trên số lượng cục máu đông được xác định

= 26 Khả năng kết nối Pixel "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300'%} ">

Đặt các pixel có giá trị lớn nhất trong hình ảnh “bw” thành 0, làm cho các pixel có màu đen.

Tìm các đối tượng có kết nối ít nhất 26 pixel trong hình ảnh bằng bwconncomp. Gán cho biến cc_1.

Bước 25: Loại bỏ các bình máu trong ảnh

Loại bỏ các mạch máu vẫn còn trong hình ảnh bằng cách sử dụng chức năng bwpropfilt với phạm vi [0, 0,9].

[0,9, 1] bị loại trừ vì các giá trị gần 1 cho biết một dòng. Gán cho “RemoveVessels”.

Bước 26: Hiển thị hình

Hiển thị từng hình ảnh đã lọc trong một ô con. Imshow. với đầu vào 'border' và 'chặt chẽ', hiển thị từng hình ảnh trong cấu trúc ô con. Thêm tiêu đề cho mỗi hình ảnh để phân biệt bộ lọc nào đã được sử dụng.

Bước 27: Loại bỏ các bình và đếm các khối máu

1. Dùng “RemoveVessels” và áp dụng tính năng ‘Centroid’ trong các phần tử vùng để xác định tâm của các đối tượng trong hình ảnh. Những vật thể này phải tương ứng với cục máu đông có trong hình ảnh.

2. Đếm số lượng cục máu đông được xác định bằng cách lấy chiều dài của ma trận trung tâm.

Bước 28: Chẩn đoán hình ảnh võng mạc dựa trên số lượng cục máu đông được xác định

Sử dụng câu lệnh if để chẩn đoán hình ảnh dựa trên số lượng cục máu đông được xác định.

Nếu số lượng trung tâm được xác định nhỏ hơn hoặc bằng 5, hình ảnh được xác định là bình thường.

Nếu số lượng trung tâm lớn hơn 5, hình ảnh được chẩn đoán là bệnh võng mạc tiểu đường.

Kết quả được in ra cửa sổ lệnh bằng fprintf.

Bước 29: Nếu có nhiều hơn 5 khối…

Nếu có nhiều hơn 5 khối…
Nếu có nhiều hơn 5 khối…

Lặp lại các hướng dẫn ở trên cho các hình ảnh được chẩn đoán dưới dạng một tuyên bố khác. Phần này sẽ chạy nếu số lượng đốm màu lớn hơn 5.

Kết thúc câu lệnh if.

Bước 30: Lặp lại quy trình lọc cho hình ảnh bình thường với giá trị chữ số hình ảnh là 2 và 3

Lặp lại quy trình lọc cho hình ảnh bình thường với giá trị chữ số hình ảnh là 2 và 3
Lặp lại quy trình lọc cho hình ảnh bình thường với giá trị chữ số hình ảnh là 2 và 3
Lặp lại quy trình lọc cho hình ảnh bình thường với giá trị chữ số hình ảnh là 2 và 3
Lặp lại quy trình lọc cho hình ảnh bình thường với giá trị chữ số hình ảnh là 2 và 3

Lặp lại quy trình cho phần còn lại của câu lệnh if ban đầu khi numel (số chữ số trong số hình ảnh) bằng 2 và 3. Điều này hoàn thành vòng lặp for cho các hình ảnh bình thường.

Kết thúc vòng lặp for.

Bước 31: Lặp lại toàn bộ quy trình cho các hình ảnh được chẩn đoán

Lặp lại toàn bộ quy trình cho các hình ảnh được chẩn đoán
Lặp lại toàn bộ quy trình cho các hình ảnh được chẩn đoán

Lặp lại toàn bộ quá trình bằng cách sử dụng các hình ảnh được chẩn đoán được liệt kê bởi ma trận “số_tố_tính_hấp_chính”.

Đảm bảo xem qua mọi hình (i) và thay đổi nó thành hình (i + 10) để các số liệu được chẩn đoán sẽ hiển thị dưới dạng hình 11 đến 20.

Bước 32: Phân tích thống kê

Phân tích thống kê
Phân tích thống kê

1. 'Actual_Diagnosis_Matrix' được sử dụng để so sánh kết quả với chẩn đoán chính thức được tìm thấy trong tệp txt. 10 số không đầu tiên chỉ ra rằng 10 hình ảnh đầu tiên phải bình thường. 10 hình ảnh cuối cùng chỉ ra rằng 10 hình ảnh cuối cùng nên được phân loại là bệnh võng mạc tiểu đường.

2. Dấu bằng kép được sử dụng để tạo 'number_correct' tạo ra một mảng logic bằng cách so sánh giá trị của các phần tử tương ứng của 'Actual_Diagnosis_Matrix' với 'Diagnosis_Matrix' được tạo từ vòng lặp for.

Đối với mỗi phần tử phù hợp với chẩn đoán, 1 sẽ được thêm vào, có nghĩa là mã đã chẩn đoán chính xác hình ảnh đó. Nếu sai nó sẽ thêm số 0 vào ma trận.

Sau đó, lấy tổng của số đó cộng lại tất cả những cái. Nói cách khác, nó tìm tổng số các hình ảnh được chẩn đoán chính xác.

3. 'Final_percentage_correct' là tỷ lệ phần trăm được tính toán về độ chính xác của mã chẩn đoán bệnh võng mạc tiểu đường. Số lượng hình ảnh được chẩn đoán chính xác được chia cho 20 (tổng số hình ảnh) và nhân với 100 để tìm ra tỷ lệ chẩn đoán thành công.

Bước 33: Tìm khoảng tin cậy

Tìm khoảng tin cậy
Tìm khoảng tin cậy

1. Đảm bảo rằng bạn đã tải xuống ModWald.m để gọi nó dưới dạng một hàm. Nếu không có hàm, bạn sẽ phải tự tính khoảng tin cậy bằng phương pháp Wald đã sửa đổi.

2. Chức năng ModWald có 2 đầu vào trong đó đầu vào là số lượng hình ảnh được xác định chính xác và đầu vào thứ hai là tổng số lượng hình ảnh.

3. Hàm ModWald sẽ xuất ra các giới hạn dưới và trên của khoảng tin cậy của tỷ lệ đối với độ chính xác của dữ liệu được lấy mẫu. Nói cách khác, bạn sẽ đưa ra một khoảng tỷ lệ phần trăm trong đó phần trăm thực sự về độ chính xác của mã sẽ nằm.

4. Sử dụng fprintf dưới đây để xuất số liệu thống kê và khoảng tin cậy vào cửa sổ lệnh.

> fprintf ('%. 0f phần trăm hình ảnh võng mạc đã được chẩn đoán chính xác theo chẩn đoán chính thức. / n / n', Final_percentage_correct)

> fprintf ('Tỷ lệ phần trăm thực mà mã của chúng tôi sẽ chẩn đoán chính xác bệnh võng mạc tiểu đường / n sẽ nằm trong khoảng [%.3f,%.3f], dựa trên 20 hình ảnh được lấy mẫu / n', Lower_bound, upper_bound)

Đề xuất: