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

Публичный форум для 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: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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 14:26

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

Post by forthuser »

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

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

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

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

Post by Shaos »

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

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
PastaGirl-Original-Web-Uniform.png (208.87 KiB) Viewed 12848 times

Особенностью палитр с равномерно распределёнными цветами является то, что найти индекс самого близкого цвета из палитры, пользуясь значениями RGB можно по простой формуле без поиска - в случае Uniform676G формула будет такая:

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

Но чтобы проверить, что оставшиеся 4 градации серого могут быть лучше выбранного индекса, придётся таки посчитать ошибку и сравнить - например это может потребоваться для изображений в градациях серого - вот вариант с выбором ближайшего цвета без учёта дополнительных серых оттенков:

GRAYLILY-uniform676-NoG.png
GRAYLILY-uniform676-NoG.png (24.65 KiB) Viewed 12843 times

А вот с их учётом:

GRAYLILY-gray6.png
GRAYLILY-gray6.png (27.74 KiB) Viewed 12843 times

А это - оригинал:

GRAYLILY-384x288.jpg
GRAYLILY-384x288.jpg (25.85 KiB) Viewed 12843 times

Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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
PastaGirl-original-vs-uniform676.png (186.36 KiB) Viewed 12838 times

GRAYLILY-original-vs-uniform676.png
GRAYLILY-original-vs-uniform676.png (130.29 KiB) Viewed 12838 times

(в данных примерах 4 серых цвета в конце палитры не учитывались)

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

P.P.S. Возможно дело в гамме, которую GIMP учитывает (sRGB), а я - нет...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 13:59

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

Post by shiny »

а квантизация цвета не поможет?
Attachments

2023-10-19,15_18_58.png
2023-10-19,15_18_58.png (87.7 KiB) Viewed 12831 times

User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

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

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

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

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 13: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: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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
PastaGirl-Original-Uniform-Floyd.png (280.16 KiB) Viewed 12800 times

GRAYLILY-Original-Uniform-Floyd.png
GRAYLILY-Original-Uniform-Floyd.png (202.82 KiB) Viewed 12800 times

P.S. Поправил исходник: https://gitlab.com/nedopc/sprintem/-/blob/master/tools/uniformg.c?ref_type=heads
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

Увеличил в 2 раза, чтобы пикселы были виднее - слева палитра Uniform676 по формуле без дизеринга, справа дизеринг по Флойду-Стейнбергу с той же самой палитрой Uniform767:
Attachments

PastaGirl-Uniform-Floyd-2X.png
PastaGirl-Uniform-Floyd-2X.png (137.29 KiB) Viewed 12799 times

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

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

Post by shiny »

Steinberg дело вкуса, но результат по мне не самый лучший. Вот такой поинтереснее.
Attachments

dd.png
dd.png (11.04 KiB) Viewed 12793 times

User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

Спектрумовские цвета что ли? А где знакоместа и цветной «клашинг»? ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

А вот классическая Лена (уменьшенная до 256х256) в палитре Uniform676 без дизеринга и с дизерингом по Флойду-Стейнбергу:
Attachments

lena256x256_uniform676_without_and_with_dithering.png
lena256x256_uniform676_without_and_with_dithering.png (90.96 KiB) Viewed 12442 times

Я тут за главного - если что шлите мыло на me собака shaos точка net
Post Reply