Nano Hash - криптовалюты, майнинг, программирование

Как создать маску или определить участок изображения на основе значения интенсивности?

У меня есть матрица с именем figmat, из которой я получаю следующий график pcolor (Matlab -Версия R 2016b).

По сути, я хочу извлечь из этого графика только нижнюю красную линию высокой интенсивности.

Я думал сделать это каким-то образом, извлекая максимальные значения из матрицы и создавая какую-то маску на основной матрице. Но я не понимаю возможного способа добиться этого. Можно ли это сделать с помощью каких-либо алгоритмов обнаружения границ/изображений?

Я пытался что-то подобное со следующим кодом, чтобы создать маску

A=max(figmat);
figmat(figmat~=A)=0;
imagesc(figmat);

Но это дает только границу максимальных значений. Мне также нужна вся полоса красного цвета.

pcolor график


  • Красный цвет – это диапазон. figmat(figmat<=0 & figmat>-10)=0; Попробуйте то, что вам подходит 30.06.2017
  • Да. Но я не хочу жестко кодировать значение от 0 до 10, поскольку оно не является постоянным для каждого графика. (Значение продолжает меняться, но обычно я хочу извлечь максимальные значения интенсивности, такие как красный). Есть ли способ сделать это, используя определение интенсивности? 30.06.2017
  • Какие свойства этой красной полосы вы ожидаете? Можно ли считать его линейным? Может ли быть больше одной группы? Вроде есть слабая вторая полоска в -25. Каково расстояние интенсивности до других локальных максимумов? Без какой-либо информации трудно обнаружить и извлечь красную линию, поскольку она может быть прерывистой или неуникальной. 30.06.2017
  • Чем он отличается от ваших предыдущий вопрос? 30.06.2017
  • @EBH в моем предыдущем вопросе у меня не было всего графика, и наклон имел наименьшие значения, чем все остальные. Предыдущее изображение было обработанным, а не прямым графиком pcolor, созданным из исходных значений. В этом у меня есть полный график (нет нулевых значений), и красная полоса имеет максимальную интенсивность, чем все, и график pcolor применяется к исходной матрице. Я попытался запустить ваш код из моего предыдущего вопроса, но он не работал на этом графике. Пожалуйста, дайте мне знать, если я могу адаптировать то же самое с любыми модификациями. Спасибо 30.06.2017

Ответы:


1

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

[x,y] = meshgrid(-5:.2:5, -5:.2:5);
n = size(x,1)*size(x,2);
z = -0.2*(y-(0.2*x+1)).^2 + 5 + randn(size(x))*0.1;
figure
surf(x,y,z);

Этот скрипт генерирует поверхностную функцию. Его набор максимальных значений (x,y) может быть описан линейной функцией y = 0,2*x+1. Я добавил немного шума, чтобы сделать его более реалистичным.

Тестовые данные

Теперь мы выбираем все точки, где z меньше, скажем, 95 % от максимального значения. Поэтому можно использовать find. Позже мы хотим использовать одномерные данные, поэтому мы reshape все.

thresh = min(min(z)) + (max(max(z))-min(min(z)))*0.95;
mask = reshape(z > thresh,1,n);
idx = find(mask>0);
xvec = reshape(x,1,n);
yvec = reshape(y,1,n);

xvec и yvec теперь содержат координаты всех значений > thresh.

Отфильтрованные точки

Последний шаг — сделать некоторый линейный полином по всем точкам.

pp = polyfit(xvec(idx),yvec(idx),1)

pp =

    0.1946    1.0134

Очевидно, это примерно коэффициенты y = 0,2 * x + 1, как и должно быть.

Выровненная линия

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

30.06.2017
  • установить случайное начальное число rng для воспроизводимости 30.06.2017

  • 2

    Предполагая:

    1. Есть только одна полоса для извлечения.
    2. Он всегда имеет максимальные значения.
    3. Это линейно.

    Я могу принять мой предыдущий ответ и в этом случае с небольшими изменениями:

    Во-первых, мы получаем распределение значений в матрице и ищем совокупность верхних значений, которую можно отличить от меньших значений. Это делается путем нахождения максимального значения x(i) на гистограмме, которое:

    1. Является локальным максимумом (его бин выше, чем у x(i+1) и x(i-1))
    2. Имеет больше значений над ним, чем внутри него (сумма высоты ячеек от x(i+1) до x(end) ‹ высота ячейки x):

    Вот как это делается:

    [h,x] = histcounts(figmat); % get the distribution of intesities
    d = diff(fliplr(h)); % The diffrence in bin height from large x to small x
    band_min_ind = find(cumsum(d)>size(figmat,2) & d<0, 1); % 1st bin that fit the conditions
    flp_val = fliplr(x); % the value of x from large to small
    band_min = flp_val(band_min_ind); % the value of x that fit the conditions
    

    Теперь продолжаем как раньше. Замаскируйте все нежелательные значения, интерполируйте линейную линию:

    mA = figmat>band_min; % mask all values below the top value mode
    [y1,x1] = find(mA,1); % find the first nonzero row 
    [y2,x2] = find(mA,1,'last'); % find the last nonzero row
    m = (y1-y2)/(x1-x2); % the line slope
    n = y1-m*x1; % the intercept
    f_line = @(x) m.*x+n; % the line function
    

    И если мы нанесем это, мы увидим красную линию, где была полоса для обнаружения:

    строка а

    Затем мы можем сделать эту линию толще для лучшего представления этой линии:

    thick = max(sum(mA)); % mode thickness of the line
    tmp = (1:thick)-ceil(thick/2); % helper vector for expanding
    rows = bsxfun(@plus,tmp.',floor(f_line(1:size(A,2)))); % all the rows for each column
    rows(rows<1) = 1; % make sure to not get out of range
    rows(rows>size(A,1)) = size(A,1); % make sure to not get out of range
    inds = sub2ind(size(A),rows,repmat(1:size(A,2),thick,1)); % convert to linear indecies
    mA(inds) = true; % add the interpolation to the mask
    result = figmat.*mA; % apply the mask on figmat
    

    Наконец, мы можем построить этот результат после маскирования, исключая ненужные области:

    imagesc(result(any(result,2),:))
    

    строка б

    02.07.2017
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..