GridHunter & Kiora
Привет, Кира. Ты когда-нибудь пробовала использовать код, чтобы автоматически обрезать фотографию, выдерживая золотое сечение? Хочу совместить свою одержимость симметрией и твои ритуальные узоры, может, вместе получится что-то, что будет гармонично смотреться и вызывать приятные чувства.
Мне идея очень нравится. Дай мне немного времени, я вплету в небольшой скрипт что-то вроде магии и расчетов, чтобы он выбрал идеальный кусочек, а потом добавлю мягкое свечение, как будто вздох.
Звучит как сказка, правда. Только надеюсь, что с расчётами не запутаешься, а то вся магия полетит коту под хвост. Посмотрим, сможет ли сценарий сохранить чёткость.
Пара штрихов, чтобы пропорции не сбились, и немного свечения, чтобы не выходило за границы. Если вычисления начнут запутываться, просто сокращу код до какого-то маленького ритуала и пусть числа отдохнут в тишине.
Звучит как забавная, аккуратная церемония, но убедись, что все петли идеально замкнуты; даже малейшее отклонение в пропорциях всё испортит. Сияние должно быть едва заметным, как тихий шёпот, а не крик. Покажешь, когда закончишь? Любопытство ведь не грех.
Привет! Смотри, я тут написала небольшой скрипт на Python. Он берет изображение, обрезает его по золотому сечению, чтобы края остались четкими, а потом добавляет очень легкое свечение по краям.
Вот код:
```python
import cv2
import numpy as np
GOLDEN = 1.618
def crop_to_golden(src):
h,w = src.shape[:2]
# decide orientation that best fits gold
if w / h > GOLDEN:
new_w = int(h * GOLDEN)
start_x = (w - new_w)//2
cropped = src[:, start_x:start_x+new_w]
else:
new_h = int(w / GOLDEN)
start_y = (h - new_h)//2
cropped = src[start_y:start_y+new_h, :]
return cropped
def add_glow(img):
# small blur on edges only – keep core sharp
edge = cv2.GaussianBlur(img, (21,21), 0)
mask = np.zeros_like(img)
ksize = 20
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(ksize,ksize))
# dilate to get border region
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray,1,255,cv2.THRESH_BINARY)
border = cv2.dilate(thresh,kernel)-thresh
border = cv2.cvtColor(border, cv2.COLOR_GRAY2BGR)
# combine glow with image – faint whisper effect
blended = cv2.addWeighted(img,0.85,edge*border/255,0.15,0)
return blended
# usage
src = cv2.imread('your_photo.jpg')
cropped = crop_to_golden(src)
final = add_glow(cropped)
cv2.imwrite('golden_glow.jpg', final)
```
Запусти его и дай числам "подышать" — без всякой кривизны, просто лёгкий отзвук.
Выглядит неплохо, но будь внимательна с этим размытием 21х21 на больших кадрах – может смягчить края слишком сильно. И этот контур, зависящий от порога, будет захватывать случайный шум, поэтому сначала небольшое гауссово размытие маски могло бы помочь. Если уменьшишь размер ядра или сглаживаешь свечение более мягким градиентом, баланс будет лучше. Попробуй протестировать на быстром изображении и посмотри, ощущение от свечения — будто вздох или шепот.