【问题标题】:How do i ignore specific shapes on image processing, OpenCV, Python我如何忽略图像处理、OpenCV、Python 上的特定形状
【发布时间】:2019-03-08 13:27:37
【问题描述】:

我正在研究细胞分割和跟踪。我有一组显微图像。有一些由薄片引起的圆形噪音。当我使用我的算法时,可能会导致某些部分的单元格丢失。我想对我的程序说,“嘿,那些圆形的东西只是噪音,只是否认它,并在真实细胞的膜上工作。”另一种是微噪音。有一些对比度高或低的点。我想对我的程序说,“嘿,拒绝点,如果它的 10x10 像素半径与背景对比度相同。”

工作平台:Python 3.7.2、OpenCV 3.4.5

我希望,我清楚地提到了我的问题。我正在分享其中一张图片。

左边的 4 个圆圈是点噪声。 右侧的 2 个圆圈是层状噪声。

enter image description here

import numpy
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('test001.tif')
gg = img.copy()
img_gray = cv.cvtColor(gg, cv.COLOR_BGR2GRAY)

clache = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
img_gray = clache.apply(img_gray)

_, img_bin = cv.threshold(img_gray, 50, 255,
        cv.THRESH_OTSU)

img_bin = cv.morphologyEx(img_bin, cv.MORPH_OPEN,
        numpy.ones((10, 9), dtype=int))

img_bin = cv.morphologyEx(img_bin, cv.MORPH_DILATE,
        numpy.ones((5, 5), dtype=int), iterations= 1)


def segment(im1, img):
    #morphological transformations
    border = cv.dilate(img, None, iterations=10)
    border = border - cv.erode(border, None, iterations=1)
    #invert the image so black becomes white, and vice versa
    img = -img
    #applies distance transform and shows visualization
    dt = cv.distanceTransform(img, 2, 3)
    dt = ((dt - dt.min()) / (dt.max() - dt.min()) * 255).astype(numpy.uint8)
    #reapply contrast to strengthen boundaries
    clache = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    dt = clache.apply(dt)
    #rethreshold the image
    _, dt = cv.threshold(dt, 127, 255, cv.THRESH_BINARY)

    ret, markers = cv.connectedComponents(dt)
    markers = markers+1
    # Complete the markers
    markers[border == 255] = 255

    markers = markers.astype(numpy.int32)
    #apply watershed
    cv.watershed(im1, markers)

    markers[markers == -1] = 0
    markers = markers.astype(numpy.uint8)
    #return the image as one list, and the labels as another.
    return dt, markers
dt, result = segment(img, img_bin)
cv.imshow('img',img)
cv.imshow('dt',dt)

cv.imshow('img_bin',img_bin)
cv.imshow('res',result)

下面是一只豚鼠。

import numpy
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('test001.tif')
gg = img.copy()
img_gray = cv.cvtColor(gg, cv.COLOR_BGR2GRAY)

clache = cv.createCLAHE(clipLimit=2.0, tileGridSize=(20,20))
img_gray = clache.apply(img_gray)

cv.imshow('1img',img)
cv.imshow('2gray',img_gray)

#Threshold
_, img_bin = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)
cv.imshow('3threshold',img_bin)

#MorpClose
img_bin = cv.morphologyEx(img_bin, cv.MORPH_CLOSE,numpy.ones((5,5), dtype=int))
cv.imshow('4morp_close',img_bin)

#MorpErosion
img_bin = cv.erode(img_bin,numpy.ones((3,3),dtype=int),iterations = 1)
cv.imshow('5erosion',img_bin)

#MorpOpen
img_bin = cv.morphologyEx(img_bin, cv.MORPH_OPEN, numpy.ones((2, 2), dtype=int))
#cv.imshow('6morp_open',img_bin)

#MorpDilate
img_bin = cv.morphologyEx(img_bin, cv.MORPH_DILATE,numpy.ones((1, 1), dtype=int), iterations= 1)
#cv.imshow('7morp_dilate',img_bin)

#MorpBlackHat
img_bin = cv.morphologyEx(img_bin, cv.MORPH_BLACKHAT,numpy.ones((4,4),dtype=int))
#cv.imshow('8morpTophat',img_bin)

【问题讨论】:

  • 请提供一些您已经尝试过的代码。并且,在您的示例图像中,请标出什么是噪声、什么是微噪声、什么是感兴趣的结构等。
  • 完成。但是,关于我所说的,什么都没有。只是一些功能。

标签: python opencv image-processing computer-vision image-segmentation


【解决方案1】:

对于那些小点你可以试试eroding and dilating:

您需要将图像转换为灰度然后对其进行处理,我将创建一个带有侵蚀和膨胀部分的蒙版以删除这些点,然后在原始图像上使用该蒙版删除这些点而不影响分辨率你的初始图像。

对于大的模糊斑点,是否可以在图像中添加一些噪点并与原始图像进行比较?

如果大多数这些 blob 是 cv2.HoughCircles 描述的 here,它会执行以下操作:

当然,您可以调整这些参数以适应您的需求,而忽略图像的这些部分。试试这个和噪音,这可能有助于减少误报。 祝你好运!

【讨论】:

  • 其实这些功能我已经试过了,你可以看到下面的代码,它会导致丢失部分单元格。为了比较,我考虑过(但尚未应用)单元格是透明的,我仍然可能会丢失它的某些部分。也许在这种情况下,我可以避免因腐蚀而失败。
  • 将腐蚀和扩张与圆形检测相结合可能有助于仅删除达到特定大小的小斑点。如果您有足够大的数据集,您甚至可以尝试级联过滤器。
  • 好吧,我会试试的。可悲的是,我只有 19 张图像,而且这些噪音是独一无二的。我无法指定它们。算法必须指定它。
猜你喜欢
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2012-06-24
  • 1970-01-01
相关资源
最近更新 更多