Как игнорировать конкретные фигуры при обработке изображений, OpenCV, Python - PullRequest
0 голосов
/ 08 марта 2019

Я занимаюсь сегментацией и отслеживанием клеток. У меня множество микроскопических изображений. Есть несколько круговых шумов, вызванных ламелью. Когда я использую свой алгоритм, это может привести к потере клеток некоторых частей. Я хочу сказать моей программе: «Эй, смотри, эти круглые вещи - просто шум, и просто отрицают это, и работай над мембраной реальной клетки». Другой, микро-шумы. Есть несколько точек с высокой или низкой контрастностью. Я хочу сказать своей программе: «Эй, отрицайте точки, если радиус 10x10 пикселей совпадает с контрастом фона».

Рабочая платформа: Python 3.7.2, OpenCV 3.4.5

Надеюсь, я четко упомянул, в чем моя проблема. Я делюсь одним из этих изображений.

4 кружка слева - точечные шумы. 2 круга справа - ламельные шумы.

введите описание изображения здесь

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)

1 Ответ

0 голосов
/ 11 марта 2019

Для этих маленьких точек вы можете попробовать размывание и расширение :

Вам нужно преобразовать изображение в оттенки серого и затем обработать его, я бы создал маску с размытым и расширеннымчасти, чтобы удалить эти точки, а затем использовать эту маску на исходном изображении, чтобы удалить точки без ущерба для разрешения исходного изображения.

enter image description here

Длябольшие пятна пятна, может быть, добавить немного шума на изображение и сравнить с оригиналом?

Если большинство этих BLOB-объектов cv2.HoughCircles описано здесь , оно делает что-то вроде этого:

enter image description here

Конечно, вы можете настроить эти параметры, чтобы соответствовать тому, что вы хотите, и просто игнорировать эти части изображения.Попробуйте это, а также шум, который может помочь уменьшить количество ложных срабатываний.Желаем удачи!

...