2017-07-14 185 views
0

我正在使用以下代碼來檢測不同顏色的斑點之間的樹皮圓斑點。Python - 查找圖像上不同顏色的輪廓

import numpy as np 
import cv2 

im = cv2.imread('im.jpg') 

imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
ret,thresh = cv2.threshold(imgray,200,255,0) 
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
cv2.drawContours(im,contours,-1,(0,0,255),1) 

#(B,G,R) 

cv2.imshow('image',im) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

但是我很難爲藍色的斑點畫出不同的彩色輪廓。我嘗試使用多個輪廓:

import numpy as np 
import cv2 

im = cv2.imread('im.jpg') 

imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
ret,thresh = cv2.threshold(imgray,200,255,0) 
ret, thresh2 = cv2.threshold(imgray,130,255,0) 
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
contours2, hierarchy2 = cv2.findContours(thresh2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

cv2.drawContours(im,contours,-1,(0,0,255),1) 
cv2.drawContours(im,contours2,-1,(0,255,0),1) 

#(B,G,R) 

cv2.imshow('image',im) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

這種方法的第一個問題是它不能準確地只勾勒出藍色斑點。此外,根據照明等情況,必須根據每個圖像修改threshold函數中的靈敏度等級。是否有更平滑的方法來執行此操作?

+0

它不會傷害,如果你讀了一些關於彩色圖像處理... – Piglet

+0

我做到了,這就是我得到這個目標的方式。但是,像一些幫助進步的id。 – Jonathan

+0

你有沒有跳過關於色相的部分? :D見headcrabs答案。如果要進行彩色圖像處理,請確保您瞭解RGB,HSV和其他標準色彩空間。 – Piglet

回答

1

基於this

import cv2 
import numpy as np 

img = cv2.imread("bluepink.jpg") 
imghsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
lower_blue = np.array([110,50,50]) 
upper_blue = np.array([130,255,255]) 
mask_blue = cv2.inRange(imghsv, lower_blue, upper_blue) 
_, contours, _ = cv2.findContours(mask_blue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
im = np.copy(img) 
cv2.drawContours(im, contours, -1, (0, 255, 0), 1) 
cv2.imwrite("contours_blue.png", im) 

enter image description here

不理想,但似乎那裏沒有誤報。你可以通過增加另一個接近黑色的顏色範圍來改善它(因爲真正的深色只存在於那些藍色的斑點內)。也許有一些額外的膨脹腐蝕,它從來沒有傷害擴大腐蝕。