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

Сопоставление шаблонов с использованием PyOpenCl

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

файл Python:

import pyopencl as cl
import numpy as np
from PIL import Image
from time import time
import cv2


def getAssets(platform,device):
    plat = cl.get_platforms()[platform]
    dev = plat.get_devices()[device]
    ctx = cl.Context([dev])
    q = cl.CommandQueue(ctx)
    return ctx,q

def getKernel():
    string = "F:\Image processing\Template\matchTemplate.c"
    krnl = open(string).read()
    return krnl

def execution(image,template):

    cntx,queue = getAssets(0,0)

    img = np.asarray(image).astype(np.int32)
    temp = np.asarray(template).astype(np.int32)

    mf = cl.mem_flags

    inp = cl.Buffer(cntx,mf.READ_ONLY | mf.COPY_HOST_PTR,hostbuf=img)
    tmp = cl.Buffer(cntx,mf.READ_ONLY | mf.COPY_HOST_PTR,hostbuf=temp)
    out = cl.Buffer(cntx,mf.WRITE_ONLY,img.nbytes)

    task = cl.Program(cntx,getKernel()%(x,y)).build()

    val = task.matchTmp(queue,img.shape,None,inp,tmp,out)

    output = np.empty_like(img)

    cl.enqueue_copy(queue,output,out)

    output = output.astype(np.uint8)
    print(output,output.min(),output.max())
    return np.array(output)


def showResult(image,template):
    result = execution(image,template)
    result = Image.fromarray(result)
    result.show()


if __name__ == '__main__':
    image = cv2.imread("F:\Image processing\Template\cam.jpg",0)
    template = cv2.imread("F:\Image processing\Template\Template.jpg",0)
    global x,y
    x = image.shape[1]
    y = image.shape[0]
    # print(image.shape)
    # cv2.imshow("image",template)
    # cv2.waitKey(0)
    showResult(image,template)

файл ядра:

#pragma OPENCL EXTENSION cl_khr_fp64 : enable
__kernel void matchTmp(__global int *inp,__global int *tmp,__global int *out){
      int j = get_global_id(1);
      int i = get_global_id(0);
      int x = get_global_id(3);
      int y = get_global_id(2);
      int Iwidth = %d;
      int rown = %d;
      int w = 48;
      int r= 48;
      int value = 0,value1,value2,value3;

          value1 = value1 + half_powr((tmp[x*48 + y] - inp[(i+x)*Iwidth + (j+y)]),2);
          value2 = value2 + half_powr(tmp[x*48 + y],2);
          value3 = value3 + half_powr(inp[(i+x)*Iwidth + (j+y)],2);
          value = (value1/half_sqrt(value2*value3))*50;


          value = (value < 0   ? 0   : value);
          value = (value > 255 ? 255 : value);
          out[i*Iwidth + j] = value;

  }

Изображение: используемое изображение

Шаблон: шаблон для сопоставления

Результат: это результат

Я использовал method=CV_TM_SQDIFF_NORMED, как показано на этом сайте OpenCV документ. Я действительно получаю большое значение рядом с объектом, но почему все остальное черное? Фактический результат должен выглядеть примерно так, как показано здесь... Может ли кто-нибудь помочь мне с этим, пожалуйста!


  • Я подозреваю, что из-за того, что шаблон не очень хорошо соответствует небу, вы получите очень низкие оценки корреляции и поэтому очень темные. 31.05.2020
  • ладно... Но можете ли вы объяснить, почему на изображении самое высокое значение находится в центре шаблона. он должен быть в левом верхнем углу шаблона... До того, что я наблюдал в других примерах... 31.05.2020
  • Пик, кажется, составляет около 240 210. Вот где у вас есть большое самое яркое пятно. Большинство сопоставлений с шаблонами возвращает наилучшее совпадение для того места, где левый верхний угол шаблона находится в наилучшем соответствии. Итак, около 220 200. Но я не знаю ни вашего pyopencl, ни вашего кода. Таким образом, он может возвращать координаты центра шаблона в месте наилучшего совпадения, которое действительно соответствует яркому пятну около 240 210. Так что вроде нормально работает. 31.05.2020
  • @ fmw42, не могли бы вы дать мне несколько ссылок о том, как работает сопоставление шаблонов ... например, некоторые псевдокоды, документация, алгоритмы и т. Д. ... Это было бы очень полезно, что касается других моих изображений, результат отличается ... 31.05.2020
  • Поиск в Google. Вы найдете множество ссылок. См., например: opencv-python-tutroals. readthedocs.io/en/latest/py_tutorials/ и researchgate.net/figure/ 31.05.2020

Ответы:


1

Я не знаю pyopencl. Но вот демонстрация сопоставления шаблонов в Python/OpenCV для ваших изображений, показывающая соответствие наилучшего совпадения во входном изображении и в корреляционном изображении, полученном в результате matchTemplate().

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

Вход:

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

Шаблон:

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

import cv2
import numpy as np

# read image
img = cv2.imread('airplane.jpg')

# read template
tmplt = cv2.imread('airplane_tail.jpg')
hh, ww = tmplt.shape[:2]

# do template matching
# move template across image 1 pixe shift at a time and compute the correlation metric at each shift position as an image
corrimg = cv2.matchTemplate(img,tmplt,cv2.TM_CCOEFF_NORMED)

# get location of best match corresponding to the upper left corner of template from the brightest spot in corrimg
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(corrimg)
max_val_ncc = '{:.3f}'.format(max_val)
print("normalize_cross_correlation: " + max_val_ncc)
xx = max_loc[0]
yy = max_loc[1]
print('x_match_loc =',xx,'y_match_loc =',yy)

# draw template bounds in red onto img and corrimg scaled to 8-bit range
result1 = img.copy()
result2 = (255*corrimg).clip(0,255).astype(np.uint8)
result2 = cv2.merge([result2,result2,result2])
cv2.rectangle(result1, (xx, yy), (xx+ww, yy+hh), (0, 0, 255), 1)
cv2.rectangle(result2, (xx, yy), (xx+ww, yy+hh), (0, 0, 255), 1)

# save results
cv2.imwrite('airplane_template_match_location.jpg', result1)
cv2.imwrite('airplane_correlation_image_location.jpg', result2)

# show images
cv2.imshow('image', img)
cv2.imshow('template', tmplt)
cv2.imshow('result1', result1)
cv2.imshow('result2', result2)
cv2.waitKey(0)
cv2.destroyAllWindows()


Соответствие местоположению во входном изображении:

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

Место совпадения на корреляционном изображении:

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

Текстовый вывод:

normalize_cross_correlation: 0.996
x_match_loc = 216 y_match_loc = 190


31.05.2020
  • Хорошо ... это дает мне результат, никаких проблем. Что я хочу, так это увидеть мое изображение результата, у меня просто есть несколько высоких значений рядом с шаблоном, вот и все. Но что мне делать, чтобы получить результирующее изображение (коррелированную матрицу), такое же, как у opencv? 01.06.2020
  • Новые материалы

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

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

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

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

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

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

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