I'm working on a project in which I have to detect some disease on leaves. For this purpose, I've to detect salient features i.e. leaves (in my case) and remove the background of the image. I've the following code.
import cv2, sys
import numpy as np
def backproject(source, target, levels = 2, scale = 1):
hsv = cv2.cvtColor(source, cv2.COLOR_BGR2HSV)
hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
# calculating object histogram
roihist = cv2.calcHist([hsv],[0, 1], None, [levels, levels], [0, 180, 0, 256] )
# normalize histogram and apply backprojection
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256], scale)
return dst
def saliency_by_backprojection(img):
cv2.pyrMeanShiftFiltering(img, 2, 10, img, 4)
backproj = np.uint8(backproject(img, img, levels = 2))
cv2.normalize(backproj,backproj,0,255,cv2.NORM_MINMAX)
saliencies = [backproj, backproj, backproj]
saliency = cv2.merge(saliencies)
cv2.pyrMeanShiftFiltering(saliency, 20, 200, saliency, 2)
saliency = cv2.cvtColor(saliency, cv2.COLOR_BGR2GRAY)
cv2.equalizeHist(saliency, saliency)
return 255-saliency
def saliency_map(img):
saliency_hsv = saliency_by_backprojection(img * 1)
saliency = saliency_hsv
(T, saliency) = cv2.threshold(saliency, 200, 255, cv2.THRESH_BINARY)
return saliency
def largest_contours_rect(saliency):
contours, hierarchy = cv2.findContours(saliency * 1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key = cv2.contourArea)
return cv2.boundingRect(contours[-1])
def refine_saliency_with_grabcut(img, saliency):
rect = largest_contours_rect(saliency)
bgdmodel = np.zeros((1, 65),np.float64)
fgdmodel = np.zeros((1, 65),np.float64)
saliency[np.where(saliency > 0)] = cv2.GC_FGD
mask = saliency
cv2.grabCut(img, mask, rect, bgdmodel, fgdmodel, 1, cv2.GC_INIT_WITH_RECT)
mask = np.where((mask==2)|(mask==0),0,1).astype('uint8')
return mask
def backprojection_saliency(img):
saliency = saliency_map(img)
mask = refine_saliency_with_grabcut(img, saliency)
return mask
if __name__ == "__main__":
name = sys.argv[1].strip('k5.jpg')
img = cv2.imread(sys.argv[1], 1)
img = cv2.resize(img, (640/2, 480/2))
mask = backprojection_saliency(img)
segmentation = img*mask[:,:,np.newaxis]
cv2.imshow("original", img)
cv2.imshow("segmentation", segmentation)
cv2.waitKey(-1)
Since I'm new to Python and openCV, I am unable to resolve the following error.
Traceback (most recent call last):
File "F:\FYP\Code\saliency-from-backproj-master\saliency.py", line
56, in <module>
name = sys.argv[1].strip('k5.jpg')
IndexError: list index out of range
Why is this happening?