Как я могу программно применить фильтр Photoshop «Пикселизация> Кристаллизовать» к изображению?

#php #api #unity3d #photoshop #image-manipulation

#php #API #unity3d #photoshop #обработка изображений

Вопрос:

Мне нужно применить фильтр crystallized pixels к изображению через некоторый API или библиотеку. Этот эффект должен выглядеть следующим образом:

image_example

Таким образом, это не обычный пиксельный эффект, пиксели не имеют квадратной формы.

Есть ли какой-либо API, который я могу использовать? Я искал это, но я немного заблудился.

Комментарии:

1. Crystalize — это алгоритм обработки изображений, который может быть реализован на многих разных языках. Я бы посоветовал выбрать предпочтительный технический стек и сузить ваш вопрос. например, я нашел реализацию Scala, которая, вероятно, не помогла бы за несколько минут поиска в Google…

Ответ №1:

Упс, я только что заметил, что вы отметили PHP, а не Python — извините! Я оставлю это пока в качестве ссылки и, возможно, сделаю версию PHP в другой день.

У меня была быстрая попытка сделать это, и это работает достаточно хорошо:

 #!/usr/bin/env python3

import numpy
import random
import math
import sys
from PIL import Image

def crystallize(im, cnt):
    # Make output image same size
    res = np.zeros_like(im)
    h, w = im.shape[:2]
    # Generate some randomly placed crystal centres
    nx = np.random.randint(0,w,cnt,dtype=np.uint16)
    ny = np.random.randint(0,h,cnt,dtype=np.uint16)
    # Pick up colours at those locations from source image
    sRGB = []
    for i in range(cnt):
        sRGB.append(im[ny[i],nx[i]])

    # Iterate over image
    for y in range(h):
        for x in range(w):
            # Find nearest crystal centre...
            dmin = sys.float_info.max
            for i in range(cnt):
                d = (y-ny[i])*(y-ny[i])   (x-nx[i])*(x-nx[i])
                if d < dmin:
                    dmin = d
                    j = i
            # ... and copy colour of original image to result
            res[y,x,:] = sRGB[j]
    return res

# Open image, crystallize and save
im  = Image.open('duck.jpg')
res = crystallize(np.array(im),200)
Image.fromarray(res).save('result.png')
  

Это превращает это:

введите описание изображения здесь

в это:

введите описание изображения здесь

или это, если вы выбираете 500 кристаллов:

введите описание изображения здесь


Скорость, вероятно, можно улучшить, уменьшив количество цветов до 256 и разложив изображение на палитры, найдя ближайший цвет для каждого, а затем просто просмотрев их в LUT. Может быть, работа на черный день…


Ключевые слова: Python, voronoi, crystal, crystallize, Photoshop, фильтр, изображение, обработка изображений, Numpy, PIL, Pillow.

Комментарии:

1. Удивительный ответ.

Ответ №2:

Вот как применить фильтр Crystallize с помощью Photoshop api на Python, взято из примераhttps://github.com/lohriialo/photoshop-scripting-python/blob/master/EmbossAction.py

 from win32com.client import Dispatch, GetActiveObject

app = GetActiveObject("Photoshop.Application")
fileName = "C:GithubTest.psd"
docRef = app.Open(fileName)

docRef.ActiveLayer = docRef.ArtLayers.Item(1)

def applyCrystallize(cellSize):
    cellSizeID = app.CharIDToTypeID("ClSz")
    eventCrystallizeID = app.CharIDToTypeID("Crst")
    filterDescriptor = Dispatch('Photoshop.ActionDescriptor')
    filterDescriptor.PutInteger(cellSizeID, cellSize)
    app.ExecuteAction(eventCrystallizeID, filterDescriptor)

applyCrystallize(25)