Spaces:
Sleeping
Sleeping
| #Import Required Packages | |
| import numpy as np | |
| import gradio as gr | |
| #from google.colab.patches import cv2_imshow | |
| import cv2 | |
| import matplotlib.pyplot as plt | |
| import numpy as np | |
| import skimage | |
| import imutils | |
| from imutils import contours | |
| import math | |
| def cube (v): | |
| return v**3 | |
| def sqrtabs (v) : | |
| return math.sqrt(abs(v)) | |
| def figplota(xvalues): | |
| fig = plt.figure() | |
| plt.plot(xvalues, figure=fig) | |
| return fig | |
| def quant(imageinput): | |
| #@title Please Input the Lateral Flow Assay Image | |
| # read image using openCV | |
| #path = "/content/l1.jpg" | |
| image = cv2.imread(imageinput)#imageinput | |
| target = "PKU" | |
| #print(image) | |
| #cv2_imshow(image) | |
| # Convert the image to grayscale | |
| BGR2RGB = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) | |
| gray = cv2.cvtColor(BGR2RGB, cv2.COLOR_RGB2GRAY) | |
| #print(gray) | |
| #cv2_imshow(gray) | |
| # Invert the image to negative scale | |
| negative = cv2.bitwise_not(gray) | |
| negativeimage = negative.copy() #save a copy to avoid disrupting the image contour | |
| #print(negativeimage) | |
| #cv2_imshow(negativeimage) | |
| # Minimize the noisy effects of artificats using Gaussian blur (helps with minimizing the effect of noisy artifactual bright-spots) | |
| blur = cv2.GaussianBlur(negativeimage, (11, 11), 0) | |
| #print(blur) | |
| #cv2_imshow(blur) | |
| # Binarize Image | |
| threshold = float(cv2.meanStdDev(blur)[0]) + 0.6*float(cv2.meanStdDev(blur)[1]) | |
| imgthreshold = cv2.threshold(blur, threshold, 255, cv2.THRESH_BINARY)[1] | |
| #print(imgthreshold) | |
| #cv2_imshow(image_thresh) | |
| # Reducing noise noise through eroding & eroding | |
| imgeroding = cv2.erode(imgthreshold, None, iterations=1) | |
| zeronoise = cv2.dilate(imgeroding, None, iterations=1) | |
| #print(zeronoise) | |
| #cv2_imshow(zeronoise) | |
| # CCA the threshold Image | |
| import skimage.measure | |
| labels = skimage.measure.label(zeronoise, background=0) | |
| masking = np.zeros(zeronoise.shape, dtype="uint8") | |
| for label in np.unique(labels): | |
| if label == 0: | |
| continue | |
| MaskL = np.zeros(zeronoise.shape, dtype="uint8") | |
| MaskL[labels == label] = 255 | |
| numPixels = cv2.countNonZero(MaskL) | |
| if numPixels > masking.shape[1]*3: | |
| masking = cv2.add(masking, MaskL) | |
| #cv2_imshow(mask) | |
| # Find the contours and sort, please change from bottom-to-top to top-to-bottom accordingly | |
| contourss = cv2.findContours(masking.copy(), cv2.RETR_EXTERNAL, | |
| cv2.CHAIN_APPROX_SIMPLE) | |
| contourss = imutils.grab_contours(contourss) | |
| contourss = contours.sort_contours(contourss, method="bottom-to-top")[0] #change here accordingly | |
| final= [] | |
| if len(contourss) > 1: | |
| for (i, c) in enumerate(contourss): | |
| # draw the bright spot on the image for the control and sample band | |
| x, y, width, height = cv2.boundingRect(c) | |
| final.append(negativeimage[y:y+height, x:x+width]) | |
| rect = cv2.minAreaRect(c) | |
| box = cv2.boxPoints(rect) | |
| # convert all coordinates floating point values to int | |
| box = np.int0(box) | |
| # draw a rectangle | |
| cv2.drawContours(image, [box], 0, (0, 0, 255), thickness=2) | |
| elif len(contourss) == 1: | |
| # draw the bright spot on the image for the control band | |
| for (i, c) in enumerate(contourss): | |
| x, y, width, height = cv2.boundingRect(c) | |
| final.append(negativeimage[y:y+height, x:x+width]) | |
| rect = cv2.minAreaRect(c) | |
| box = cv2.boxPoints(rect) | |
| # convert all coordinates floating point values to int | |
| box = np.int0(box) | |
| # draw a rectangle | |
| cv2.drawContours(image, [box], 0, (0, 0, 255), thickness=2) | |
| # Return error message for unclear tests | |
| else : | |
| print("No Bands Detected") | |
| #print(image) | |
| #cv2_imshow(image) | |
| # generate signal ratio of sample to control band, you can change according to sorting of bands | |
| ratio1 = cv2.meanStdDev(final[0])[0] | |
| ratio=((cube(math.cos(sqrtabs(ratio1 - -0.393284)) + 2.2783713) / pow(math.cos(y), 0.20675313)) - (math.exp(math.cos(math.cos((sqrtabs(math.tan(cube(ratio1)) - (ratio1 +math.tan(math.sin(ratio1)))) / 0.44953698) * 0.9778089))) + (-2.3363407 / ratio1))) | |
| thresho = 20 | |
| sig=final[0][0] | |
| #signal=plt.plot(sig,figure=plt.figure()) | |
| if ratio >= thresho: | |
| xx=str("The test band signal [" + str(ratio) + "mg/dl] shows a " + target +"-POSITIVE test." +" " + "Classic PKU, needs urgent medical treatment") | |
| elif ratio >= 2 and ratio <6: | |
| xx=str("The test band signal [" + str(ratio) + "mg/dl] shows a " + target +"-POSITIVE test." +" " + "Likely PKU phenotype.") | |
| elif ratio >= 6 and ratio <12: | |
| xx=str("The test band signal [" + str(ratio) + "mg/dl] shows a " + target +"-POSITIVE test." +" " + "PKU and dietary restriction is recommended") | |
| elif ratio >=12 and ratio <20: | |
| xx=str("The test band signal [" + str(ratio) + "mg/dl] shows a " + target +"-POSITIVE test." +" " + "PKU and need medical attention for risk of intellectuall impairment") | |
| else: | |
| xx=str("The test band signal[" + str(ratio) + "mg/dl] shows a " + target +"-NEGATIVE test.") | |
| return xx,figplota(sig),cv2.resize(image, (20,60), interpolation = cv2.INTER_AREA) #cv2.resize(signal, (20,40), interpolation = cv2.INTER_AREA)#,cv2.resize(signal, (20,40), interpolation = cv2.INTER_AREA) | |
| iface = gr.Interface(quant, gr.Image(type="filepath"), outputs=["text","plot","image"]) | |
| iface.launch() |