Leaf disease detection using image processing, OpenCV, and Python is a non-invasive and efficient way to detect the diseases in the plant.
There are some benefits for this First, it is much faster, allowing farmers to inspect large fields of crops quickly and easily. Second, it is more accurate, as algorithms can be trained to identify diseases that are difficult to spot with the naked eye. Third, it is non-invasive, meaning that leaves do not need to be damaged or destroyed for testing.
We are going to present the code which use the color segmentation technique to segment the real time frames from the camera. Once frame is captured, it is passed to the color segmenation based code. That code detect the dominant color of the image. Then using a simple rule based approach the disease is predicted with healthy or diseased plant.
Python Code for Leaf Disease Detection using Color Segmentation
Here is the complete code for this project
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
cap.set(3,320)
cap.set(4,240)
def dominateColor(images):
#Check the distribution of red values
v = []
c = ['Red','Green','Blue']
red_value = np.mean(images[:, :, 2])
v.append(red_value)
# Check the distribution of green values
green_value = np.mean(images[:, :, 1])
v.append(green_value)
# Check the distribution of blue values
blue_value = np.mean(images[:, :, 0])
v.append(blue_value)
#print(c[v.index(max(v))])
return v.index(max(v))
def detect_leaf(img):
kernel = np.ones((7,7),np.uint8)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# find the brown color
mask_brown = cv2.inRange(hsv, (8, 60, 20), (30, 255, 200))
# find the yellow and green color in the leaf
mask_yellow_green = cv2.inRange(hsv, (10, 39, 64), (86, 255, 255))
# find any of the three colors(green or brown or yellow) in the image
mask = cv2.bitwise_or(mask_yellow_green, mask_brown)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
#output = cv2.bitwise_and(img, img, mask=mask)
return mask
redCount = 0
greenCount = 0
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
if ret:
mask = detect_leaf(frame)
contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
output = frame
if contours:
# find the biggest countour (c) by the area
c = max(contours, key = cv2.contourArea)
x,y,w,h = cv2.boundingRect(c)
crop_img = frame[y:y+h, x:x+w]
#cv2.imshow('new',crop_img)
dc = dominateColor(crop_img)
if dc == 0:
redCount = redCount+1
greenCount = 0
cv2.rectangle(output,(x,y),(x+w,y+h),(0,0,255),2)
if dc == 1:
#hist2 = cv2.calcHist([crop_img],None,[256],[0,256])
hist2 = cv2.calcHist([crop_img],[1],None,[256],[0,256])
histogram, bin_edges = np.histogram(
crop_img[:, :, 1], bins=10, range=(0, 10)
)
if sum(histogram)>140:
greenCount = greenCount+1
redCount = 0
cv2.rectangle(output,(x,y),(x+w,y+h),(0,255,0),2)
else:
redCount = redCount + 1
greenCount = 0
cv2.rectangle(output,(x,y),(x+w,y+h),(0,0,255),2)
#print(histogram)
#hsv_croped = cv2.cvtColor(crop_img, cv2.COLOR_BGR2HSV)
#lower = np.array([22, 93, 0])
#upper = np.array([45, 255, 255])
#mask = cv2.inRange(hsv_croped, lower, upper)
#o2 = cv2.bitwise_and(crop_img, crop_img, mask=mask)
#cv2.rectangle(output,(x,y),(x+w,y+h),(0,255,0),2)
#cv2.imshow('cim',o2)
if redCount> 10:
redCount = 0
greenCount = 0
print('Deseased Leaf')
elif greenCount>10:
greenCount = 0
redCount = 0
print('Healthy Leaf')
cv2.imshow('frame',output)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
print('no frame')
break;
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Code language: Python (python)