Замена круглых пятен соответствующими цветами - PullRequest
0 голосов
/ 11 февраля 2019

Моя цель здесь - заменить пятно в mask_image цветом, соответствующим пятну в original_image.Что я сделал здесь, так это нашел подключенные компоненты и пометил их, но я не могу понять, как найти соответствующее помеченное место и заменить его.Как я могу поместить n кружков в n объектов и заполнить их соответствующей интенсивностью?Мы будем благодарны за любую помощь.

Например, если пятно в (2, 1) на изображении маски должно быть окрашено цветом соответствующего пятна на этом изображении ниже.

изображение маски http://myfair.software/goethe/images/mask.jpg

mask

исходное изображение http://myfair.software/goethe/images/original.jpg original image

def thresh(img):
    ret , threshold = cv2.threshold(img,5,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    return threshold

def spot_id(img):
    seed_pt = (5, 5)
    fill_color = 0
    mask = np.zeros_like(img)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    for th in range(5, 255):
        prev_mask = mask.copy()
        mask = cv2.threshold(img, th, 255, cv2.THRESH_BINARY)[1]
        mask = cv2.floodFill(mask, None, seed_pt, fill_color)[1]

        mask = cv2.bitwise_or(mask, prev_mask)

        mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

    #here I labelled them
    n_centers, labels = cv2.connectedComponents(mask)
    label_hue = np.uint8(892*labels/np.max(labels))
    blank_ch = 255*np.ones_like(label_hue)
    labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])
    labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)
    labeled_img[label_hue==0] = 0

    print('There are %d bright spots in the image.'%n_centers)

    cv2.imshow("labeled_img",labeled_img)
    return mask, n_centers

image_thresh = thresh(img_greyscaled)
mask, centers = spot_id(img_greyscaled)

1 Ответ

0 голосов
/ 11 февраля 2019

Существует один очень простой способ выполнить эту задачу.Сначала нужно выбрать значение в центре каждой точки в mask_image.Затем один расширяет этот цвет, чтобы заполнить точку на том же изображении.

Вот некоторый код, использующий PyDIP (потому что я знаю его лучше, чем OpenCV, я автор), яЯ уверен, что нечто подобное можно сделать только с помощью OpenCV:

import PyDIP as dip
import cv2
import numpy as np

# Load the color image shown in the question
original_image = cv2.imread('/home/cris/tmp/BxW25.png')
# Load the mask image shown in the question
mask_image = cv2.imread('/home/cris/tmp/aqf3Z.png')[:,:,0]

# Get a single colored pixel in the middle of each spot of the mask
colors = dip.EuclideanSkeleton(mask_image > 50, 'loose ends away') * original_image

# Spread that color across the full spot
# (dilation and similar operators like this one don't work with color images,
#  so we apply the operation on each channel separately)
for t in range(colors.TensorElements()):
   colors.TensorElement(t).Copy(dip.MorphologicalReconstruction(colors.TensorElement(t), mask_image))

# Save the result
cv2.imwrite('/home/cris/tmp/so.png', np.array(colors))

output of code above

...