我想准确地将图片转换为黑白图像,其中种子将由白色表示,背景为黑色。我想在python opencv代码中使用它。请帮帮我
我使用下面给出的代码得到了上面图片的好结果。现在我有另一张图片,其中阈值似乎不起作用。我该如何解决这个问题。我得到的输出如下图所示
另外,种子中有一些凹痕,程序将其作为种子的边界,这不是如下图所示的良好结果。我怎样才能使程序忽略凹痕。在这种情况下掩盖种子是一个很好的选择。
答案 0 :(得分:4)
我将图像从BGR色彩空间转换为HSV色彩空间。
然后我提取了 hue 频道:
然后我对它执行了阈值:
注意:强>
每当您在某些区域遇到困难时,尝试在不同的色彩空间中工作,HSV色彩空间最为突出。
<强>更新强>
以下是代码:
import cv2
import numpy as np
filename = 'seed.jpg'
img = cv2.imread(filename) #---Reading image file---
hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #---Converting RGB image to HSV
hue, saturation, value, = cv2.split(hsv_img) #---Splitting HSV image to 3 channels---
blur = cv2.GaussianBlur(hue,(3,3),0) #---Blur to smooth the edges---
ret,th = cv2.threshold(blur, 38, 255, 0) #---Binary threshold---
cv2.imshow('th.jpg',th)
现在,您可以执行轮廓操作以突出显示您感兴趣的区域。试试看!! :)
另一个更新:
我发现轮廓高于某个约束来得到这个:
答案 1 :(得分:2)
图像分割有无数种方法。
最简单的是全局阈值操作。如果您想了解更多其他方法,您应该阅读一些书籍。无论如何,我建议您进行任何进一步的图像处理。如果您不了解最基本的工具,开始图像处理没有多大意义。
只是为了向您展示如何实现这一目标:
我将图像从RGB转换为HSB。然后,我将单独的全局阈值应用于色调和亮度通道,以获得两个图像的最佳分割结果。 然后使用逐像素AND操作组合两个二进制图像。我这样做是因为两个通道都给出了次优效果,但它们的重叠非常好。 我还应用了一些形态学运算符来清理结果。 当然,您可以反转图像以获得所需的黑色背景......
阈值和使用的频道当然取决于您拥有的图像以及您想要实现的目标。这是一个特定于案例的过程,可以在有限的范围内动态调整。