Повторное использование выровненных изображений для обнаружения краев и определения пороговых значений - PullRequest
0 голосов
/ 23 октября 2019

Привет, я пытаюсь реализовать фокусировку в Python. Я посмотрел на Фотошоп и как он складывает изображения, и результаты исключительно хороши. Но я хочу применить аналогичную технику, используя Python.

  1. В настоящее время я использовал алгоритм ECC для выравнивания изображений вместе
  2. Закончил обнаружение краев на них, расширил и размыл изображения
  3. Применено пороговое значение для создания области интереса (не уверен насчет этого шага). И я застрял здесь, как действовать. В Photoshop, когда мы загружаем стопку изображений, мы используем автоматическое выравнивание, чтобы выровнять изображения, а затем, когда мы собираем их вместе, он создает маски изображений, с помощью которых он создает четкое конечное изображение. Было бы очень полезно, если бы кто-то мог рассмотреть то, что я сделал до сих пор, в правильном направлении, а если не направить меня к нему.
def stackImagesECC(file_list):
    M = np.eye(3, 3, dtype=np.float32)

    first_image = None
    stacked_image = None

    for file in file_list:
        image = cv2.imread(file,1).astype(np.float32) / 255
        print(file)
        if first_image is None:
            # convert to gray scale floating point image
            first_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
            stacked_image = image
        else:
            # Estimate perspective transform
            s, M = cv2.findTransformECC(cv2.cvtColor(image,cv2.COLOR_BGR2GRAY), first_image, M, cv2.MOTION_HOMOGRAPHY)
            w, h, _ = image.shape
            # Align image to first image
            image = cv2.warpPerspective(image, M, (h, w))
            stacked_image += image

    stacked_image /= len(file_list)
    stacked_image = (stacked_image*255).astype(np.uint8)
    return stacked_image

Эта функция выравнивает изображения

images = glob.glob("edges_canny/*.jpg")
kernel = np.ones((3, 3), np.uint8)
for image in images:
    with open(image, 'rb') as file:
        img = Image.open(file)
#         img.show()
        indexed = np.array(img)
        img_dilate = cv2.dilate(indexed, kernel, iterations=1)
        very_blurred = ndimage.gaussian_filter(img_dilate, sigma=5)
        ret, thresh5 = cv2.threshold(very_blurred, 100, 255, cv2.THRESH_TOZERO_INV) 
        cv2.imshow("a",thresh5)
        cv2.waitKey(0)

Здесь я снова читаю обнаруженные по краям изображения и выполняю дилатацию, размытие по Гауссу и определение пороговых значений, чтобы получить области интереса (в которых я не уверен). Я считаю, что есть какой-то способ непосредственного чтения выровненных изображений из функции выравнивания.

...