Привет, я пытаюсь реализовать фокусировку в Python. Я посмотрел на Фотошоп и как он складывает изображения, и результаты исключительно хороши. Но я хочу применить аналогичную технику, используя Python.
- В настоящее время я использовал алгоритм ECC для выравнивания изображений вместе
- Закончил обнаружение краев на них, расширил и размыл изображения
- Применено пороговое значение для создания области интереса (не уверен насчет этого шага). И я застрял здесь, как действовать. В 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)
Здесь я снова читаю обнаруженные по краям изображения и выполняю дилатацию, размытие по Гауссу и определение пороговых значений, чтобы получить области интереса (в которых я не уверен). Я считаю, что есть какой-то способ непосредственного чтения выровненных изображений из функции выравнивания.