【发布时间】:2018-01-25 10:58:21
【问题描述】:
我正在开展一个项目,我必须在其中检测叶子上的一些疾病。为此,我必须检测显着特征,即叶子(在我的情况下)并删除图像的背景。我有以下代码。
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)
由于我是 Python 和 openCV 的新手,我无法解决以下错误。
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
为什么会这样?
【问题讨论】:
-
看起来您没有向脚本传递所需数量的参数
-
您正在调用 argv[1],因此是第二个参数。由于您可能使用少于 2 个参数调用脚本,因此您的程序会尝试访问不存在的内容。因此出现“IndexError”。
-
也许您应该花一点时间学习核心 Python,然后再尝试将它与 OpenCV 等高级工具一起使用。这不仅可以消除大多数此类问题,还可以更轻松地理解
cv2模块文档。 -
这不仅是重复的(无论如何也很容易调试),而且您还发布了几行完全不相关的代码。请学会在发布之前将您的代码简化为 MCVE (stackoverflow.com/help/mcve)
-
无关:您可能也想阅读
str.strip()的文档(并在交互式python shell 中尝试一下) - 这:sys.argv[1].strip('k5.jpg')肯定不会达到您的预期。
标签: python python-2.7 opencv