gimp python - как изменить цвет пикселя? - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы загрузить 2 изображения JPG с Gimp Python. Затем картинки нужно сравнивать попиксельно. Если пиксель на рисунке 2 имеет определенное значение rgb, пиксель на рисунке 1 должен быть цветным. Перед этим должен быть введен пользовательский ввод, в который можно ввести начальное значение.

Я не уверен, может ли gimp python все это сделать?

В первую очередь я ищу команды:
- загрузить картинку
- Пользовательский ввод
- Загрузить значение пикселя RGB
- Изменить значение пикселя RGB
- Сохранить изображение

Большое спасибо заранее

Сначала я попробовал c ++, но работать с изображениями не так просто. Мой учитель посоветовал мне позаниматься. Схема должна выглядеть так:

#include <iostream>
using namespace std;

int main()
{
unsigned long long int startPixelBreite;
unsigned long long int startPixelHoehe;
int prozent;


//EDIT: Load pic 1
//EDIT: load pic 2


//startpixel bestimmen durch usereingabe
    cout << "Startpixel Höhe" << endl;
    cin >> startPixelBreite;
    cout << "Startpixel Höhe" << endl;
    cin >> startPixelHoehe;

//breite + Höhe von bild 1 auslesen
        endpixelBreite = startPixelBreite + bildBreite1
        endpixelHoehe = startPixelHoehe + bildHoehe1

    //ANFANG: Schleife für pixelzeile
        aktuellerPixelX = 0;
        //ANFANG schleife für pixel pixelreihe


             //pixelfarbebild1 einlesen
                /*
                pixelfarbebild1[0]  = //rot
                pixelfarbebild1[1]  = //grün
                pixelfarbebild1[2]  = //blau
                */

            //pixelfarbebild2 einlesen
                /*
                pixelfarbebild2[0]  = //rot
                pixelfarbebild2[1]  = //grün
                pixelfarbebild2[2]  = //blau
                */

            if (aktuellerPixelX > startPixelBreite & aktuellerPixelX< endpixelBreite)
            {
                if pixelfarbe[0] = 102 & pixelfarbe[1] = 102 & pixelfabre [2] = 102 //grau
                {
                    prozent = 60
                    neuerpixel[0] = (pixelfarbebild1[0]*prozent-100*pixelfarbebild1[0]+100*pixelfarbebild2[0])/prozent  //rot
                    neuerpixel[1] = (pixelfarbebild1[1]*prozent-100*pixelfarbebild1[1]+100*pixelfarbebild2[1])/prozent  //grün
                    neuerpixel[2] = (pixelfarbebild1[2]*prozent-100*pixelfarbebild1[2]+100*pixelfarbebild2[2])/prozent  //blau
                }
                else if pixelfarbe[0] = 237 & pixelfarbe[1] = 136 & pixelfabre [2] = 196 //pink
                {
                    prozent = 70
                    neuerpixel[0] = (pixelfarbebild1[0]*prozent-100*pixelfarbebild1[0]+100*pixelfarbebild2[0])/prozent  //rot
                    neuerpixel[1] = (pixelfarbebild1[1]*prozent-100*pixelfarbebild1[1]+100*pixelfarbebild2[1])/prozent  //grün
                    neuerpixel[2] = (pixelfarbebild1[2]*prozent-100*pixelfarbebild1[2]+100*pixelfarbebild2[2])/prozent  //blau
                }
                else if pixelfarbe[0] = 175 & pixelfarbe[1] = 167 & pixelfabre [2] = 172 //hellgrau
                {
                    prozent = 67
                    neuerpixel[0] = (pixelfarbebild1[0]*prozent-100*pixelfarbebild1[0]+100*pixelfarbebild2[0])/prozent  //rot
                    neuerpixel[1] = (pixelfarbebild1[1]*prozent-100*pixelfarbebild1[1]+100*pixelfarbebild2[1])/prozent  //grün
                    neuerpixel[2] = (pixelfarbebild1[2]*prozent-100*pixelfarbebild1[2]+100*pixelfarbebild2[2])/prozent  //blau
                }
                else
                {
                    neuerpixel[0] = pixelfarbebild2[0]  //rot
                    neuerpixel[1] = pixelfarbebild2[1]  //grün
                    neuerpixel[2] = pixelfarbebild2[2]  //blau
                }

                //pixel in bild schreiben
            }
            else{
                neuerpixel[0] = pixelfarbebild2[0]  //rot
                neuerpixel[1] = pixelfarbebild2[1]  //grün
                neuerpixel[2] = pixelfarbebild2[2]  //blau
            }

            aktuellerPixelX++;

        //ENDE schleife für pixel pixelreihe

    //ENDE: Schleife für pixelzeile
//ausgabe

}

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

В matlab / octave это очень просто.Нет необходимости в gimp, и хорошо интегрируется с C ++, если вы абсолютно должны иметь интеграцию кода C ++.Например, допустим, вы хотите изменить пиксели Image2 на R: 50, G: 60, B: 70, всякий раз, когда Image1 имеет пиксели R: 10, G: 20, B: 30.Затем:

% Alle kommentierure im lingula retardata fur demonstraru how rude it looks

Im1 = imread('im1.jpg');   Im2 = imread('im2.jpg'); % readure imagurine
 R1 = Im1(:,:,1);           R2 = Im1(:,:,1);        % selectu 'red'   layeru piripitsi
 G1 = Im1(:,:,2);           G2 = Im1(:,:,2);        % selectu 'green' layeru piripitsi
 B1 = Im1(:,:,3);           B2 = Im1(:,:,3);        % selectu 'blue'  layeru piripitsi

Mask = (R1 == 10) & (G1 == 20) & (B1 == 30); % криеит маск фром чаннелз
R2(Mask) = 50; % πουτ 50 γουεαρ Mask ηζ True!
G2(Mask) = 60; % πουτ 60 γουεαρ Mask ηζ True!
B2(Mask) = 70; % πουτ 70 γουεαρ Mask ηζ True!

NewIm2 = cat(3, R2, G2, B2); % Sukasumeseleba! Habibi chan! Uleleleleleeeeeeeh!!!!!

Вы можете аналогичным образом читать и сравнивать изображения в python, используя scipy.imread, numpy и т. Д., Если вы предпочитаете python вместо matlab.Нет необходимости в gimp.


PS.Как вы, возможно, поняли из моих саркастических комментариев к коду, пожалуйста, рассмотрите возможность написания кода исключительно на английском языке, когда спрашиваете международную аудиторию, такую ​​как SO.Очень смешно и утомительно читать такой «смешанный» код, и поэтому он выглядит грубым и невнимательным;(и это справедливо даже для кого-то вроде меня лично, несмотря на то, что я говорю на достаточном количестве немецкого языка, а английский не является моим родным языком).Не говоря уже о том, что вы рискуете излишне ограничивать свою аудиторию только носителями немецкого языка!

0 голосов
/ 20 ноября 2018

Вы можете / должны использовать «области пикселей» для экспорта / импорта слоев в / из массивов python.Мой скрипт использует это для переноса пикселей Gimp в массив numpy:

# Returns NP array (N,bpp) (single vector of triplets)
def channelData(layer):
    w,h=layer.width,layer.height
    region=layer.get_pixel_rgn(0, 0, w,h)
    pixChars=region[:,:]
    bpp=region.bpp
    return np.frombuffer(pixChars,dtype=np.uint8).reshape(w,h,bpp)

Это код Gimp 2.8, возможно, потребуется внести некоторые изменения для поддержки большей битовой глубины в 2.10.

Вобратное направление:

def createResultLayer(image,name,result):
    rlBytes=np.uint8(result).tobytes();
    rl=gimp.Layer(image,name,image.width,image.height,
                  image.active_layer.type,100,NORMAL_MODE)
    region=rl.get_pixel_rgn(0, 0, rl.width,rl.height,True)
    region[:,:]=rlBytes
    image.add_layer(rl,0)
    gimp.displays_flush()

Вы, конечно, можете отбросить эту клочковатую часть, но если вы можете выразить свою проблему в виде глобальных операций с массивами, все может быть очень быстро.В Windows (или используя версию flatpak в Linux) вы должны добавить numpy к среде исполнения Python, используемой Gimp.Смотрите здесь для некоторых подсказок.Здесь вы найдете полный сценарий, который также можно использовать в качестве примера того, как получить изображение и слой.

См. здесь для документации по API для Python.

0 голосов
/ 20 ноября 2018

Совершенно другой ответ, который позволяет избежать выделения пикселей из Gimp

Таким образом, у нас есть слой «изображение» (где вы окрашиваете пиксели) и слой «карта» (где заданным цветом вы указываете, какие пикселидолжен быть цветным).Затем:

  • Сделайте выбор цвета для слоя "map" (gimp_by_color_select(maplayer,...))
  • Используя этот выбор (который является глобальным на изображении и поэтому применяется к любомуlayer), раскрасьте пиксели на слое изображения (выделение заливки, для однородного цвета: gimp_edit_bucket_fill(imagelayer,...)).
  • Для более сложных цветовых схем вы можете нарисовать 3-й слой, вставьте его под "image »и удалите выделенные пиксели, чтобы сделать его видимым, затем объедините на нем слой изображения.

Все это выполняется с помощью операторов Gimp и выполняется очень быстро.Его также можно использовать как ручную процедуру, так что вы можете сначала попробовать его в Gimp, не написав ни единой строки кода.

0 голосов
/ 19 ноября 2018

В GIMP проверьте процедуры gimp_drawable_get_pixel и gimp_drawable_set_pixel. Вы можете найти все процедуры, которые можно использовать в плагине Python, в разделе Фильтры -> Python Fu -> Консоль.

Очень простой код, просто чтобы дать вам представление, может быть:

color_to_edit = (102, 102, 102) #or whatever color you wish to edit, this is an RGB value without alpha channel
new_color = (200, 200, 200) #the new color
for i in range(x_size):
    for j in range(y_size):
        num_channels, pixel = pdb.gimp_drawable_get_pixel(drawable, i, j)
        if all([p == q for p, q in zip(pixel, color_to_edit)]):
            pdb.gimp_drawable_set_pixel(drawable, i, j, 3, new_color)
pdb.gimp_displays_flush() #this will update the image.

Здесь drawable должен быть слой gimp с вашим изображением.

...