Сегментация части изображения с использованием порога - PullRequest
1 голос
/ 15 ноября 2011

Я пытаюсь изолировать и сегментировать желтый кузов автомобиля, чтобы изменить его цвет. Для этого мне нужно отдельно идентифицировать тело по изображению. И продолжайте выступление с оставшимися белыми пикселями. И я использую C #, здесь план

Color d;
Color newColor = Color.YellowGreen;    
for(inti =0;i<carimage.Width;i++){
    for(intj =0;j<carimage.Height;j++){
        d = carimage.GetPixel(i, j);
            if(d.R == 255 && d.G==255 && d.B == 255)
                image.SetPixel(i, j, newColor );
    }
}

Простое установление порога создаст второе изображение, где кузов автомобиля не отделен правильно. Я пробовал Aforge.net Фильтр изображения «Заполнить дыры», но никаких значительных изменений в пороговом изображении не было. Я пытался использовать цветной фильтр, но я не вернул правильный вывод из-за изменения цвета тела. Кто-нибудь может предложить и решение для этого?

Исходное изображение

original image

Пороговое изображение

threshold image

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

Вместо порогового значения вы можете рассмотреть кластеризацию.

В качестве быстрого и грязного теста я увеличил яркость изображения в пространстве HSB (используя Mathematica):

BrightAdjusted = Image [Map [# ^ {1, 1, 0.2}&, ImageData [ColorConvert [img, "HSB"]], {2}], ColorSpace -> "HSB"]

enter image description here

Тогда я использовал простойK-ближайшая кластеризация:

(cluster = ClusteringComponents [ColorConvert [brightAdjusted, "RGB"], 3, метод -> "KMeans"]) // Colorize

enter image description here

, чтобы найти кластеры схожих цветов на изображении (есть еще много, возможно, более подходящих алгоритмов кластеризации, поэтому вам следует немного поэкспериментировать).Тогда я могу просто настроить цвет в одном из кластеров:

Image [MapThread [If [# 1 == 2, # 2 [[{1, 3, 2}]], # 2] &, {cluster, ImageData [brightAdjusted]}, 2]]

enter image description here

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

0 голосов
/ 09 декабря 2012
    I=imread('test.jpg'); 
    I=im2double(rgb2gray(I)); 
    BW=im2bw(I,0.64);imshow(BW)

дает мне:

изображение http://s10.postimage.org/izo0py7jd/Untitled.jpg

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

0 голосов
/ 15 ноября 2011

Если вы собираетесь использовать набор порогов, вам лучше выбрать желтые оттенки в значении насыщенности оттенка цветовое пространство .См. Связанный ТАК вопрос .

0 голосов
/ 15 ноября 2011

У меня был похожий проект несколько лет назад.Я не могу вспомнить точные детали, но идея состояла в том, чтобы сдвинуть (не слишком маленькое) скользящее окно по изображению и рассчитать среднюю интенсивность (возможно, для R, G и B отдельно) внутри окна в каждой позиции.Я заполнил «пороговое изображение» этими средними и вычел его из исходного изображения.Где-то был коэффициент масштабирования и другие настройки, но суть в том, что такой подход был намного лучше, чем использование постоянного порога.

...