当前位置: 首页 > 知识库问答 >
问题:

检测纸上的黑色墨水斑点-OpenCV Android

潘雅珺
2023-03-14

我是openCV的新手,我一直在学习为Android提供的示例。

我的目标是检测颜色斑点,所以我从颜色斑点检测样本开始。

我将彩色图像转换为灰度,然后使用二值阈值进行阈值化。

背景是白色的,斑点是黑色的。我想探测那些黑色斑点。此外,我想画他们的彩色轮廓,但我不能这样做,因为图像是黑白的。

我已经设法在灰度中完成了这一点,但我不喜欢轮廓的绘制方式,这就像颜色容差太高,轮廓比实际的斑点大(可能斑点太小?)。我想我所说的“容差”与setHsvColor有关,但我不太理解这种方法。

提前感谢!最好的问候

更新更多信息

我要跟踪的图像是墨迹分割。想象一下,一张白色的纸上有黑色的墨水裂开。现在我正在做实时(摄像机视图)。实际的应用程序将拍摄一张照片并分析该照片。

正如我上面所说,我从openCV GitHub回购中获取了颜色斑点检测样本(Android)。我将此代码添加到onCameron aFrame方法中(以便实时将其转换为黑白)进行转换,所以我不介意墨水是黑色,蓝色,红色:

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(示例应用的日志条目)抛出检测到的轮廓数,但我无法看到它们,因为图像是黑白的,例如,我希望轮廓是红色的。

谢谢你的帮助!如果你需要更多的信息,我很乐意更新这个问题

更新:彩色斑点检测样本的GitHub repo(第二幅图像)

Android版openCV示例的GitHub Repo

共有1个答案

杨豪
2023-03-14

该解决方案基于自适应图像阈值和使用连通分量算法的组合。

假设——纸张是图像中最亮的区域,而纸张上的墨点是最暗的区域。

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)

从阈值和反转操作屏蔽图像。

使用连接的组件。

将连接组件的输出叠加在输入图像上。

 类似资料:
  • 纸小墨(Ink)是一个使用GO语言编写的静态博客构建工具,可以快速搭建博客网站。无依赖跨平台,配置简单,构建快速,支持多用户,默认主题简洁,对中文排版进行了优化。

  • 使用PDFBox 2.0.4将页面提取为图像,我的结果页面包含多个“黑洞”,如下图所示: 这种情况只发生在本PDF和其他PDF中:http://www.filedropper.com/selection_3 下面是一个简单的代码(使用JavaFX)来重现问题(下载PDF后更改文件路径): 以下是我的依赖项: pdfbox 2.0.4 jai-Imageio-jpeg2000 1.3.0(防止错误:

  • 我尝试在我的DB中更新一个表“image”并插入blob类型。 ImageClass: Hibernate用户映射: 利布: 错误:

  • 当我将203DPI改为300DPI时,我遇到了打印区域大小的问题,即Zebra ZT 230打印机。我使用嵌入式驱动程序通过以太网连接安装了这台打印机。我的标签有10X12厘米(宽x高),它有两个条形码,一个是9码中的3码,另一个是128码。当我使用203 DPI配置时,9个条码中的第3个条码打印的分辨率不足以使用任何数据收集器读取,因此我将配置更改为300 DPI以解决分辨率问题,当我进行此更改

  • 问题内容: 我在测试应用程序中成功实现了OpenCV平方检测示例,但是现在需要过滤输出,因为它很乱-还是我的代码错误? 我对减少偏斜(如那样)和进一步处理的四个角落很感兴趣…… 码: 编辑17/08/2012: 要在图像上绘制检测到的正方形,请使用以下代码: 问题答案: 这是反复出现的主题,由于我找不到相关的实现,因此决定接受挑战。 我对OpenCV中存在的squares演示进行了一些修改,下面生

  • 我刷新了一个表在hive使用Spark-sql(v 1.6.0),之后的impala是无法读取表的完整内容。 从tablename limit 10中选择*;给出了一些结果,其中来自tablename的选择计数(*)给出了以下错误 查找文件中的1073561824时出错:hdfs://server/products/path/db/tablename/part-00017错误(255):未知错误2