2016-11-24 60 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