File size: 3,066 Bytes
dd35bad
 
 
 
 
 
 
 
 
0a3951e
dd35bad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
## OCR Gradio ##

import numpy as np
import gradio as gr
import pytesseract
import re
import cv2

def bmd_reader(input_img):
    pytesseract.pytesseract.tesseract_cmd = 'tesseract'
    image = cv2.resize(input_img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
    # Convert the image to grayscale
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # Threshold the image to remove noise and improve OCR accuracy
    threshold = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    # Set the configuration parameters for pytesseract
    config = ('-l eng --oem 1 --psm 6')
    # Run pytesseract on the thresholded image
    text = pytesseract.image_to_string(threshold, config=config)
    
    matches = re.finditer(r'\b[Nn]ormal\b|\b[Oo]steopenia\b|\b[Oo]steoporosis\b|\b[Ll]ow [Bb]one\b', text)
    hipmatches = re.finditer(r'\b[Hh]ip\b|\b[Ff]emur\b|\b[Nn]eck\b|\b[Tt]roch\b',text)
    spinematches = re.finditer(r'\b[Ss]pine\b|\b[Ll]umber\b|\bL1\b|\bL2\b|\bL3\b',text)
    wristmatches = re.finditer(r'\b[Ww]rist\b|\b[Ff]orearm\b|\b[Ra]adius\b',text)

    # Iterate over the matches and print the location of each match
    for match in matches:
        #print(f"Match '{match.group()}' found at ({match.start()}, {match.end()})")
        diag = match.group()
    # change low bone to osteopenia
        if diag == "Low Bone" or diag == "low bone" or diag == "Low bone" or diag == "low Bone":
            diag = "Osteopenia" 
        if not diag:
            diag = "Diagnosis not found."
    #return diag

    h = 0
    for match in hipmatches:       
        hip = match.group()
        h = h + 1
    s = 0
    for match in spinematches:       
        spine = match.group()
        s = s + 1
    f = 0
    for match in wristmatches:
        wrist = match.group()
        f = f + 1
    #print(h, s, f)  

    if h == 0 and s == 0 and f == 0:
        location = "หาตำแหน่งจากรูปภาพได้ไม่ชัดเจน"
    elif h > 0:
        location = "ผลการตรวจมวลกระดูกของบริเวณสะโพก"
    elif s > 0:
        location = "ผลการตรวจมวลกระดูกของบริเวณกระดูกสันหลัง"
    elif f > 0:
        location = "ผลการตรวจมวลกระดูกของบริเวณกระดูกข้อมือ"
 
    return location, diag

#demo = gr.Interface(sepia, gr.Image(),"text")    
 
demo = gr.Interface(
    fn = bmd_reader, 
    inputs = "image", 
    outputs = [gr.Textbox(
            label="บริเวณตำแหน่งที่ตรวจ",                 
            value="กระดูกสันหลัง หรือกระดูกสะโพก",
            ) , 
            gr.Textbox(
            label="ผลอ่านจากการประมวลผลตัวอักษร",                 
            value="ผลวินิจฉัย",
            ) ],
    )

demo.launch()