OpenCV (48) --- реализовать ностальгический фильтр и фильтр комиксов

OpenCV
OpenCV (48) --- реализовать ностальгический фильтр и фильтр комиксов

Принцип реализации фильтра ностальгии

Будь то мобильный телефон 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. Конечно, читатели, хорошо разбирающиеся в математике и питающие слабость к алгоритмам, могут разработать свои собственные алгоритмы фильтрации, чтобы обогатить эффекты фильтров.