2016-11-24 63 views
0

我是openCV的新手,我一直在爲Android提供的示例。在紙上檢測黑色墨水斑點 - Opencv Android

我的目標是檢測色塊,所以我開始使用色塊檢測示例。

我將彩色圖像轉換爲灰度,然後使用二進制閾值進行閾值處理。

背景是白色的,斑點是黑色的。我想檢測那些黑色斑點。此外,我想繪製他們的輪廓顏色,但我不能做到這一點,因爲圖像是黑色和白色。

我已經設法在灰度中實現這一點,但我不喜歡如何繪製輪廓,這就像顏色容差太高,輪廓比實際的斑點大(可能斑點太小?)。我想我談論的這個'寬容'與setHsvColor有關,但我不太明白這個方法。

在此先感謝!順祝商祺

更新的詳細信息

我要跟蹤的圖像是墨分裂的。想象一張白紙與黑色墨水分裂。現在我正在實時進行拍攝(相機視圖)。實際的應用程序會拍攝照片並分析該照片。

正如我上面所說的,我從openCV GitHub回購中獲取了color-blob-detection示例(android)。我在onCameraFrame方法添加以下代碼(爲了將其轉換爲黑白實時)的皈依製成,所以如果油墨是黑色,藍色,紅色,我不介意:

mRgba = inputFrame.rgba(); 
/**************************************************************************/ 
/** BLACK AND WHITE **/ 
// Convert to Grey 
Imgproc.cvtColor(inputFrame.gray(), mRgba, Imgproc.COLOR_GRAY2RGBA, 4); 

Mat blackAndWhiteMat = new Mat (H, W, CvType.CV_8U, new Scalar(1)); 
double umbral = 100.0; 
Imgproc.threshold(mRgba, blackAndWhiteMat , umbral, 255, Imgproc.THRESH_BINARY); 

// convert back to bitmap for displaying 
Bitmap resultBitmap = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); 
blackAndWhiteMat.convertTo(blackAndWhiteMat, CvType.CV_8UC1); 
Utils.matToBitmap(blackAndWhiteMat, resultBitmap); 
/**************************************************************************/ 

這可能不是最好的方法,但它的工作原理。

現在我想檢測黑色斑點(墨水分割)。我想他們會被檢測到,因爲Logcat(示例應用程序的日誌條目)會拋出檢測到的輪廓數量,但我無法看到它們,因爲圖像是黑白的,我希望輪廓是紅色的。

下面是一個例子形象: - enter image description here

這裏是我開始使用RGB(彩色斑點檢測的,不是黑白圖像)。注意未檢測到小斑點。 (有可能檢測到它們嗎?還是它們太小?) enter image description here

感謝您的幫助!如果您需要更多的信息,我會很樂意更新這個問題

UPDATE:彩色斑點檢測樣品(第二圖像)

GitHub Repo of openCV sample for Android

+0

你好,你的問題是相當不提供信息。請上傳輸入圖像以及您的處理過程。這將有助於理解這個問題。作爲一個例子,看到這個問題:http://stackoverflow.com/q/10168686/1874627 – saurabheights

+0

@saurabheights感謝您的評論。我會用更多的信息和代碼片段更新這個問題 – sebasira

+0

好吧,我可以建議的東西很少。只要有一個很好的對比,不管小的還是大的斑點都不應該成爲問題。如果您可以找到大多數像素爲白色的區域(檢查連接的組件),您將獲得紙張區域。如果你發現一個子區域是黑色的(低於紙張區域的平均強度),你會發現所有的斑點。要繪製輪廓,您需要找到黑色區域的凸包。另外,您是否可以上傳代碼(或鏈接到它)以獲取第二個圖像輸出的實現方式。這裏遲到了,明天再檢查一下。感謝您的更新。 – saurabheights

回答

0

的GitHub庫的解決方案是基於自適應的組合圖像閾值化和連通分量算法的使用。

假設 - 紙張是圖像中亮度最高的區域,而紙張上的墨點是最黑暗的區域。

from random import Random 
import numpy as np 
import cv2 

def random_color(random): 
    """ 
    Return a random color 
    """ 
    icolor = random.randint(0, 0xFFFFFF) 
    return [icolor & 0xff, (icolor >> 8) & 0xff, (icolor >> 16) & 0xff] 

#Read as Grayscale 
img = cv2.imread('1-input.jpg', 0) 
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 

# Gaussian to remove noisy region, comment to see its affect. 
img = cv2.medianBlur(img,5) 

#Find average intensity to distinguish paper region 
avgPixelIntensity = cv2.mean(img) 
print "Average intensity of image: ", avgPixelIntensity[0] 

# Generate mask to distinguish paper region 
#0.8 - used to ignore ill-illuminated region of paper 
mask = cv2.inRange(img, avgPixelIntensity[0]*0.8, 255) 
mask = 255 - mask 
cv2.imwrite('2-maskedImg.jpg', mask) 

#Approach 1 
# You need to choose 4 or 8 for connectivity type(border pixels) 
connectivity = 8 
# Perform the operation 
output = cv2.connectedComponentsWithStats(mask, connectivity, cv2.CV_8U) 
# The first cell is the number of labels 
num_labels = output[0] 
# The second cell is the label matrix 
labels = output[1] 
# The third cell is the stat matrix 
stats = output[2] 
# The fourth cell is the centroid matrix 
centroids = output[3] 

cv2.imwrite("3-connectedcomponent.jpg", labels) 
print "Number of labels", num_labels, labels 

# create the random number 
random = Random() 

for i in range(1, num_labels): 
    print stats[i, cv2.CC_STAT_LEFT], stats[i, cv2.CC_STAT_TOP], stats[i, cv2.CC_STAT_WIDTH], stats[i, cv2.CC_STAT_HEIGHT] 
    cv2.rectangle(cimg, (stats[i, cv2.CC_STAT_LEFT], stats[i, cv2.CC_STAT_TOP]), 
     (stats[i, cv2.CC_STAT_LEFT] + stats[i, cv2.CC_STAT_WIDTH], stats[i, cv2.CC_STAT_TOP] + stats[i, cv2.CC_STAT_HEIGHT]), random_color(random), 2) 

cv2.imwrite("4-OutputImage.jpg", cimg) 

輸入圖像從閾值處理和倒置操作

The Input Image

掩蔽圖像。

Masked Image

連接的組件的用途。

CC Image

輸入圖像疊加連接的組件的輸出。

Output Image

+0

張貼後,我注意到了大的橙色矩形。如果你想忽略它,它應該是一個簡單的區域估計與圖像相比。或者像檢查長寬比一樣,一個blob將具有接近相同的高度/寬度。一個問題,這是什麼? – saurabheights

+0

@sebasira這是審美的一部分,嘿嘿。當你可以使用彩虹時,爲什麼要使用黑盒子!另外,圍繞黑色墨水斑點的黑框不會很明顯。 – saurabheights

+0

@sebasira:你能告訴我它是怎麼回事?它的準確性以及陷阱?花些時間回答,不要着急。 – saurabheights