А не написать ли нам свой собственный графический редактор?

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

Как бы такой редактор мог называться?

photoshaos
0
No votes
nedopixels
7
35%
nedopx
5
25%
hmyra
1
5%
ikzin
1
5%
ixyba
0
No votes
kyosq
2
10%
wmazo
0
No votes
xirip
0
No votes
yojog
0
No votes
никак - всё равно нифига не сделаешь...
4
20%
 
Total votes: 20
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: А не написать ли нам свой собственный графический редакт

Post by Shaos »

Shaos wrote:вот тут ещё можно подсмотреть и попробовать матрицы коэффициентов для сглаживания и подчёркивания границ: https://generic-github-user.github.io/Image-Convolution-Playground/src/
(значения в матрице брались с википедии: https://en.wikipedia.org/wiki/Kernel_%28image_processing%29 - интересно, что в русской версии статьи есть дополнительные матрицы)



Вот матрицы фильтров из моей дипломной работы (метод Filter был частью класса для работы с изображениями в градациях серого BWS, который я написал в 1995 году):

Code: Select all

int BWS::Filter(int f)
{ double d;
  int i,j,i1,j1,n,o,m[3][3];
  switch(f)
  { case SMOOTH:
         n=9;
         m[0][0]=1;m[0][1]=1;m[0][2]=1;
         m[1][0]=1;m[1][1]=1;m[1][2]=1;
         m[2][0]=1;m[2][1]=1;m[2][2]=1;
         break;
    case GAUSS:
         n=16;
         m[0][0]=1;m[0][1]=2;m[0][2]=1;
         m[1][0]=2;m[1][1]=4;m[1][2]=2;
         m[2][0]=1;m[2][1]=2;m[2][2]=1;
         break;
    case STRESS1:
         n=1;
         m[0][0]=0;m[0][1]=-1;m[0][2]=0;
         m[1][0]=-1;m[1][1]=5;m[1][2]=-1;
         m[2][0]=0;m[2][1]=-1;m[2][2]=0;
         break;
    case STRESS2:
         n=1;
         m[0][0]=-1;m[0][1]=-1;m[0][2]=-1;
         m[1][0]=-1;m[1][1]=9;m[1][2]=-1;
         m[2][0]=-1;m[2][1]=-1;m[2][2]=-1;
         break;
    case STRESS3:
         n=1;
         m[0][0]=1;m[0][1]=-2;m[0][2]=1;
         m[1][0]=-2;m[1][1]=5;m[1][2]=-2;
         m[2][0]=1;m[2][1]=-2;m[2][2]=1;
         break;
  }
  CopyScrMem();
  for(i=0;i<(col-2);i++){
  for(j=0;j<(row-2);j++){
      d=0.0;
      for(i1=0;i1<3;i1++){
      for(j1=0;j1<3;j1++){
          d+=m[i1][j1]*GetPixelMem(i+i1,j+j1);
      }}
      d/=n;
      o=round(d);
      if(o<0)o=0;
      if(o>63)o=63;
      PutPixelScr(i+1,j+1,o);
  }}
  DelMem();
  return err;
}
Вот кстати и будет с чем сравнивать быстродействие более оптимальных с точки зрения кэша данных методов :dj:
Я тут за главного - если что шлите мыло на me собака shaos точка net
forthuser
Senior
Posts: 165
Joined: 12 Jan 2023 07:26

Re: А не написать ли нам свой собственный графический редакт

Post by forthuser »

Из напмсания редактора может получиться и другая полезная программа,
как обработка изображений сканироанных электронных книг.

Пример такой народной программы со своей историей ScanKromsator

P.S. Х.З. Можно ли в одиночку написать и программу по распознаванию текста+картинки на обработанных сканах и с вариантом подключения сторонних возможных решений.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: А не написать ли нам свой собственный графический редакт

Post by Shaos »

Не - распознавание текста это совсем другая история :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: А не написать ли нам свой собственный графический редакт

Post by Shaos »

Я тут в топике про "Project Spirit" озаботился выбором самой лучшей прегенерённой 256-цветной палитры для отображения произвольных цветных изображений на палитровых графических системах:

viewtopic.php?p=170985#p170985

В результате выяснилось, что с ранних вебовских времён существует так называемая "Web Safe Palette", которая состоит из 216 цветов, представляющих цветовой куб 6x6x6, в котором каждая цветная составляющая принимает значения 0, 51, 102, 153, 204 и 255 (т.е. всего 6 значений):

https://www.rapidtables.com/web/color/Web_Safe.html

В мае 2013 года я, когда игрался с палитрами для nedoVGA, придумал (не зная про существование "Web Safe" палитры) чуть более расширенную палитру, представляющую из себя уже цветовой "прямоугольный параллелепипед" 6x7x6, в котором зелёная составляющая принимает больше значений, чем красная и синяя (7 вместо 6), что уже даёт 252 цвета, к которым я вчера добавил ещё 4 градации серого (чтобы получить 6 равномерно распределённых бесцветных уровней), что даёт полную палитру 256-цветов - можно назвать такую палитру Uniform676G и сделать "стандартной" в нашем гипотетическом графическом редакторе для быстрой индексации полноцветных изображений :mrgreen:

Вот программа для её генерации:

Code: Select all

#include <stdio.h>
#include <stdlib.h>

int main()
{
 int i,j,k,m,r,g,b;
 FILE *f = fopen("Uniform676G.gpl","wt");
 if(f==NULL) return -1;
 fprintf(f,"GIMP Palette\n");
 fprintf(f,"Name: UNIFORM-676-G6\n#\n");
 m = 0;
 for(i=0;i<6;i++){
 for(j=0;j<7;j++){
 for(k=0;k<6;k++){
   r = k*51;
   g = (int)(j*42.5);
   b = i*51;
   fprintf(f,"%3d %3d %3d\t%i\n",r,g,b,m++);
 }}}
 i = 51;
 while(m<256)
 {
   fprintf(f,"%3d %3d %3d\t%i\n",i,i,i,m++);
   i+=51;
 }
 fclose(f);
}
А вот её сравнение с палитрой "Web Safe", которая по середине (а Uniform676G - справа):
PastaGirl-Original-Web-Uniform.png
Особенностью палитр с равномерно распределёнными цветами является то, что найти индекс самого близкого цвета из палитры, пользуясь значениями RGB можно по простой формуле без поиска - в случае Uniform676G формула будет такая:

INDEX=INT((R+25)/51)+INT((G+21)/42.5)*6+INT((B+25)/51)*42

Но чтобы проверить, что оставшиеся 4 градации серого могут быть лучше выбранного индекса, придётся таки посчитать ошибку и сравнить - например это может потребоваться для изображений в градациях серого - вот вариант с выбором ближайшего цвета без учёта дополнительных серых оттенков:
GRAYLILY-uniform676-NoG.png
А вот с их учётом:
GRAYLILY-gray6.png
А это - оригинал:
GRAYLILY-384x288.jpg
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: А не написать ли нам свой собственный графический редакт

Post by Shaos »

Вот исходник, который генерит палитру Uniform676G.gpl, а также если в качестве аргумента передали PPM файл (он всегда полноцветный RGB888), то программа сконвертирует картинку в XPM с палитрой Uniform676G по формуле INDEX=INT((R+25)/51)+INT((G+21)/42.5)*6+INT((B+25)/51)*42 без дизеринга (позже я формулу подправил, чтобы вычисления были целочисленные):

https://gitlab.com/nedopc/sprintem/-/blob/master/tools/uniformg.c?ref_type=heads

Вот примеры, которые получены этой программой (слева полноцветный оригинал - справа преобразованная картинка 256 цветов без дизеринга):
PastaGirl-original-vs-uniform676.png
GRAYLILY-original-vs-uniform676.png
(в данных примерах 4 серых цвета в конце палитры не учитывались)

P.S. В предыдущем сообщении те же картинки были получены в GIMP с использованием файла палитры UNIFORM676G.gpl, а в этом - с помощью моей программы по формуле и что-то мне кажется, что эти картинки выглядят лучше, чем те :roll:

P.P.S. Возможно дело в гамме, которую GIMP учитывает (sRGB), а я - нет...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 06:59

Re: А не написать ли нам свой собственный графический редакт

Post by shiny »

а квантизация цвета не поможет?
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: А не написать ли нам свой собственный графический редакт

Post by Shaos »

Квантование цветов понадобится, когда я дойду до генерации оптимальной палитры под конкретное изображение

Пока речь идёт про универсальные палитры, пригодные для любых изображений

P.S. На самом деле универсальной палитры вполне достаточно, для терпимого Флойда-Стейнберга (см. справа):

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 06:59

Re: А не написать ли нам свой собственный графический редакт

Post by shiny »

https://en.everybodywiki.com/List_of_8-bit_computer_hardware_graphics/archive

Была еще подобная страница, поищу в архивах. А если сподобится этому редактору, то появится большой список хотелок под форматы.

Кстати, под Timex уже есть готовые утилиты - BMP2SCR и ZX Paintbrush(.mlt)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: А не написать ли нам свой собственный графический редакт

Post by Shaos »

Спасибо за ссылки!

BMP2SCR у меня есть скачанная в разных реинкарнациях, только я не знал (или забыл?), что она таймекс тоже умеет
Shaos wrote:Вот исходник, который генерит палитру Uniform676G.gpl, а также если в качестве аргумента передали PPM файл (он всегда полноцветный RGB888), то программа сконвертирует картинку в XPM с палитрой UNIFORM676G по формуле INDEX=INT((R+25)/51)+INT((G+21)/42.5)*6+INT((B+25)/51)*42 без дизеринга...
Более точная формула будет такая:

INDEX=INT((R+25.5)/51)+INT((G+21.25)/42.5)*6+INT((B+25.5)/51)*42

Цветовые составляющие R, G и B сдвигаются влево на половину цветовой полосы, чтобы яркий вариант (255) покрывал столько же, сколько и самый тёмный (0), что в 2 раза меньше всех остальных диапазонов (т.е. оно выглядит примерно так 000111111222222333333444444555). А вообще чтобы оставаться полностью в целых числах можно вот так вот сделать:

INDEX=INT((R+25)/51)+INT((2*G+43)/85)*6+INT((B+25)/51)*42

Вот примеры - оригинал (слева), ближайший цвет по формуле выше (центр) и Флойд-Стейнберг по палитре Uniform676 (справа):
PastaGirl-Original-Uniform-Floyd.png
GRAYLILY-Original-Uniform-Floyd.png
P.S. Поправил исходник: https://gitlab.com/nedopc/sprintem/-/blob/master/tools/uniformg.c?ref_type=heads
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: А не написать ли нам свой собственный графический редакт

Post by Shaos »

Увеличил в 2 раза, чтобы пикселы были виднее - слева палитра Uniform676 по формуле без дизеринга, справа дизеринг по Флойду-Стейнбергу с той же самой палитрой Uniform767:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 06:59

Re: А не написать ли нам свой собственный графический редакт

Post by shiny »

Steinberg дело вкуса, но результат по мне не самый лучший. Вот такой поинтереснее.
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: А не написать ли нам свой собственный графический редакт

Post by Shaos »

Спектрумовские цвета что ли? А где знакоместа и цветной «клашинг»? ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 06:59

Re: А не написать ли нам свой собственный графический редакт

Post by shiny »

упс, не тот конвертер :o
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: А не написать ли нам свой собственный графический редакт

Post by Shaos »

А вот классическая Лена (уменьшенная до 256х256) в палитре Uniform676 без дизеринга и с дизерингом по Флойду-Стейнбергу:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net