Принцип реализации фильтра ностальгии
Будь то мобильный телефон Honor Huawei или другие мобильные телефоны, мы можем найти ностальгический эффект в камере, который является эффектом фильтра, обычно используемым в мобильных телефонах.
Ностальгические дизайны работают в первую очередь в цветовом пространстве изображения. Взяв в качестве примера BGR, цветовые значения трех каналов B, G и R обрабатываются, чтобы придать изображению желтоватый ностальгический эффект. Разработанная формула преобразования выглядит следующим образом:
B=0.272r+0.534g+0.131*b
G=0.349r+0.686g+0.168*b
R=0.393r+0.769g+0.189*b
Строчная буква bgr в формуле расчета — это цвет канала RGB исходного изображения, а результирующий BGR — это значение после ностальгического преобразования. Следует отметить, что диапазон значений цвета составляет [0,255], что необходимо ограничить в программе.
Внедрить ностальгический фильтр
Теперь, когда мы поняли принципиальную формулу его реализации. Ниже мы непосредственно реализуем эту функцию с помощью кода, конкретный код выглядит следующим образом:
def cowboy_effect(img):
new_img = img.copy()
h, w, n = img.shape
for i in range(w):
for j in range(h):
b = img[j, i, 0]
g = img[j, i, 1]
r = img[j, i, 2]
B = int(0.272 * r + 0.534 * g + 0.131 * b)
G = int(0.349 * r + 0.686 * g + 0.168 * b)
R = int(0.393 * r + 0.769 * g + 0.189 * b)
new_img[j, i, 0] = max(0, min(B, 255))
new_img[j, i, 1] = max(0, min(G, 255))
new_img[j, i, 2] = max(0, min(R, 255))
return new_img
if __name__ == "__main__":
img = cv2.imread("48.jpg")
cv2.imshow("0", img)
cv2.imshow("1", cowboy_effect(img))
cv2.waitKey()
cv2.destroyAllWindows()
После запуска эффект следующий:
Принцип фильтра комиксов
Как видно из ностальгического фильтра, на самом деле различные эффекты фильтра камеры заключаются в вычислении и обработке цветовых каналов RGB. Поскольку существует формула ностальгического фильтра, существует также формула безотказного фильтра комиксов. Его конкретная формула выглядит следующим образом:
R = |g – b + g + r|*r / 256
G = |b – g + b + r|*r / 256
B = | B - G + B + R | * G / 256
Реализация фильтра комиксов
С помощью формулы вы можете напрямую применить приведенную ниже формулу. Конкретный код выглядит следующим образом:
# 连环画滤镜
def comics_effect(img):
new_img = img.copy()
h, w, n = img.shape
for i in range(w):
for j in range(h):
b = img[j, i, 0]
g = img[j, i, 1]
r = img[j, i, 2]
R = int(int(abs(g - b + g + r)) * r / 256)
G = int(int(abs(b - g + b + r)) * r / 256)
B = int(int(abs(b - g + b + r)) * g / 256)
new_img[j, i, 0] = R
new_img[j, i, 1] = G
new_img[j, i, 2] = B
return new_img
if __name__ == "__main__":
img = cv2.imread("48.jpg")
cv2.imshow("0", img)
cv2.imshow("1", comics_effect(img))
cv2.waitKey()
cv2.destroyAllWindows()
После запуска эффект следующий:
Подводя итог, в основном все базовые фильтры рассчитываются путем формулирования значений цвета каналов RGB. Конечно, читатели, хорошо разбирающиеся в математике и питающие слабость к алгоритмам, могут разработать свои собственные алгоритмы фильтрации, чтобы обогатить эффекты фильтров.