Выделите области разноцветным изображением с областью, которая их окружает - PullRequest
4 голосов
/ 10 февраля 2020

Я только начал с Computer Vision, а также с OpenCV.

Я работаю с изображениями мозга МРТ и мне интересно, есть ли фильтр или что-то, что позволяет мне сегментировать области, которые я отметил с красным на этом изображении:

enter image description here

Это оригинальное изображение:

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

Вопрос в следующем:

Есть ли фильтр или что-то, чтобы выделить те области, которые я окружил?

Вот что я хочу получить:

enter image description here

Ответы [ 3 ]

2 голосов
/ 11 февраля 2020

Учитывая, что разделы, которые вы хотите извлечь, имеют определенный c цвет, мы можем использовать пороговое значение цвета для изоляции объектов. Вы не указали язык, поэтому я буду использовать Python для демонстрации. Идея состоит в том, чтобы определить нижний / верхний цветовой диапазон, а затем порог цвета, используя cv2.inRange(). Мы конвертируем изображение в формат HSV, а затем используем этот диапазон для генерации двоичной сегментированной маски

lower = np.array([0, 0, 118])
upper = np.array([179, 255, 202])

image image

import numpy as np
import cv2

# Color threshold
image = cv2.imread('1.png')
original = image.copy()
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([0, 0, 118])
upper = np.array([179, 255, 202])
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(original,original,mask=mask)

cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.imshow('original', original)
cv2.waitKey()

Вы можете использовать этот скрипт с цветным порогом с трекбарами для тонкой настройки нижнего и верхнего цветовых диапазонов

import cv2
import numpy as np

def nothing(x):
    pass

# Load image
image = cv2.imread('1.png')

# Create a window
cv2.namedWindow('image')

# Create trackbars for color change
# Hue is from 0-179 for Opencv
cv2.createTrackbar('HMin', 'image', 0, 179, nothing)
cv2.createTrackbar('SMin', 'image', 0, 255, nothing)
cv2.createTrackbar('VMin', 'image', 0, 255, nothing)
cv2.createTrackbar('HMax', 'image', 0, 179, nothing)
cv2.createTrackbar('SMax', 'image', 0, 255, nothing)
cv2.createTrackbar('VMax', 'image', 0, 255, nothing)

# Set default value for Max HSV trackbars
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)

# Initialize HSV min/max values
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0

while(1):
    # Get current positions of all trackbars
    hMin = cv2.getTrackbarPos('HMin', 'image')
    sMin = cv2.getTrackbarPos('SMin', 'image')
    vMin = cv2.getTrackbarPos('VMin', 'image')
    hMax = cv2.getTrackbarPos('HMax', 'image')
    sMax = cv2.getTrackbarPos('SMax', 'image')
    vMax = cv2.getTrackbarPos('VMax', 'image')

    # Set minimum and maximum HSV values to display
    lower = np.array([hMin, sMin, vMin])
    upper = np.array([hMax, sMax, vMax])

    # Convert to HSV format and color threshold
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    result = cv2.bitwise_and(image, image, mask=mask)

    # Print if there is a change in HSV value
    if((phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ):
        print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax))
        phMin = hMin
        psMin = sMin
        pvMin = vMin
        phMax = hMax
        psMax = sMax
        pvMax = vMax

    # Display result image
    cv2.imshow('image', result)
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()
1 голос
/ 10 февраля 2020

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

Result

Вот код, который я использовал для это:

/// Global Variables
const int alpha_slider_max = 255;
int alpha_slider;
int alpha_slider2;

cv::Mat image, gray;

void on_trackbar(int, void*)
{
    cv::Mat dst1, dst2, result;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    cv::threshold(gray, dst1, alpha_slider, 255, cv::THRESH_BINARY_INV);
    gray.copyTo(dst2, dst1);
    cv::imshow("partial1", dst2);
    cv::threshold(dst2, dst2, alpha_slider2, 255, cv::THRESH_BINARY);
    cv::imshow("threshold", dst2);
}
int main()
{ 
    image = cv::imread("Brain.png");
    cv::namedWindow("threshold", 1);
    cv::createTrackbar("trakbar", "threshold", &alpha_slider, alpha_slider_max, on_trackbar);
    cv::createTrackbar("trakbar2", "threshold", &alpha_slider2, alpha_slider_max, on_trackbar);
    cv::imshow("original", image);
    while (cv::waitKey(10) != 'q');
}
1 голос
/ 10 февраля 2020

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

Вот мой простой код:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat img = imread("/ur/image/directory/image.png",CV_LOAD_IMAGE_GRAYSCALE);
    imshow("Source",img);

    for(int i=160;i<460;i++)
    {
        for(int j=130;j<460;j++)
        {
            if(img.at<uchar>(Point(j,i))<120)
                img.at<uchar>(Point(j,i)) = 0;
        }
    }

    imshow("Result",img);
    waitKey(0);
    return 0;
}

Вот изображение результата :

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...