检测纸上的黑色墨水斑点
我是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(示例应用程序的日志条目)会抛出检测到的轮廓数量,但我无法看到它们,因为图像是黑白的,我希望轮廓是红色的。
这是一个示例图像: -
这里是我使用RGB(颜色斑点检测,而不是黑白图像)。 注意未检测到小斑点。 (可以检测它们吗?还是它们太小?)
谢谢你的帮助! 如果你需要更多的信息,我会很乐意更新这个问题
更新:GitHub颜色斑点检测示例(第二个图像)
适用于Android的GitHub openCV示例回购
该解决方案基于自适应图像阈值和使用连接组件算法的组合。
假设 - 纸张是图像中最亮的区域,而纸张上的墨点是最黑暗的区域。
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)
输入图像
来自阈值和反转操作的屏蔽图像。
使用连接的组件。
叠加输入图像上连接组件的输出。
链接地址: http://www.djcxy.com/p/61075.html