nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 25 May 2024 11:31



Reply to topic  [ 42 posts ]  Go to page Previous  1, 2, 3  Next
А не написать ли нам свой собственный графический редактор? 

Как бы такой редактор мог называться?
photoshaos 0%  0%  [ 0 ]
nedopixels 29%  29%  [ 5 ]
nedopx 29%  29%  [ 5 ]
hmyra 0%  0%  [ 0 ]
ikzin 6%  6%  [ 1 ]
ixyba 0%  0%  [ 0 ]
kyosq 12%  12%  [ 2 ]
wmazo 0%  0%  [ 0 ]
xirip 0%  0%  [ 0 ]
yojog 6%  6%  [ 1 ]
никак - всё равно нифига не сделаешь... 18%  18%  [ 3 ]
Total votes : 17

А не написать ли нам свой собственный графический редактор? 
Author Message
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22784
Location: Silicon Valley
Reply with quote
Shaos wrote:
вот тут ещё можно подсмотреть и попробовать матрицы коэффициентов для сглаживания и подчёркивания границ: https://generic-github-user.github.io/Image-Convolution-Playground/src/
(значения в матрице брались с википедии: https://en.wikipedia.org/wiki/Kernel_(image_processing) - интересно, что в русской версии статьи есть дополнительные матрицы)




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

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


25 Jun 2023 14:34
Profile WWW
Senior

Joined: 12 Jan 2023 07:26
Posts: 165
Reply with quote
Из напмсания редактора может получиться и другая полезная программа,
как обработка изображений сканироанных электронных книг.

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

P.S. Х.З. Можно ли в одиночку написать и программу по распознаванию текста+картинки на обработанных сканах и с вариантом подключения сторонних возможных решений.


25 Jun 2023 20:48
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22784
Location: Silicon Valley
Reply with quote
Не - распознавание текста это совсем другая история :roll:

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


26 Jun 2023 00:33
Profile WWW
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22784
Location: Silicon Valley
Reply with quote
Я тут в топике про "Project Spirit" озаботился выбором самой лучшей прегенерённой 256-цветной палитры для отображения произвольных цветных изображений на палитровых графических системах:

http://www.nedopc.org/forum/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:
#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 - справа):

Attachment:
PastaGirl-Original-Web-Uniform.png
PastaGirl-Original-Web-Uniform.png [ 208.87 KiB | Viewed 11389 times ]


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

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

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

Attachment:
GRAYLILY-uniform676-NoG.png
GRAYLILY-uniform676-NoG.png [ 24.65 KiB | Viewed 11384 times ]

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

Attachment:
GRAYLILY-gray6.png
GRAYLILY-gray6.png [ 27.74 KiB | Viewed 11384 times ]

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

Attachment:
GRAYLILY-384x288.jpg
GRAYLILY-384x288.jpg [ 25.85 KiB | Viewed 11384 times ]

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


18 Oct 2023 21:11
Profile WWW
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22784
Location: Silicon Valley
Reply with quote
Вот исходник, который генерит палитру 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 цветов без дизеринга):

Attachment:
PastaGirl-original-vs-uniform676.png
PastaGirl-original-vs-uniform676.png [ 186.36 KiB | Viewed 11379 times ]


Attachment:
GRAYLILY-original-vs-uniform676.png
GRAYLILY-original-vs-uniform676.png [ 130.29 KiB | Viewed 11379 times ]

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

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

P.P.S. Возможно дело в гамме, которую GIMP учитывает (sRGB), а я - нет...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


19 Oct 2023 01:45
Profile WWW
Senior
User avatar

Joined: 14 Oct 2023 06:59
Posts: 157
Reply with quote
а квантизация цвета не поможет?


Attachments:
2023-10-19,15_18_58.png
2023-10-19,15_18_58.png [ 87.7 KiB | Viewed 11372 times ]

_________________
uselessretro.blogspot.com
19 Oct 2023 05:24
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22784
Location: Silicon Valley
Reply with quote
Квантование цветов понадобится, когда я дойду до генерации оптимальной палитры под конкретное изображение

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

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

Image

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


19 Oct 2023 09:12
Profile WWW
Senior
User avatar

Joined: 14 Oct 2023 06:59
Posts: 157
Reply with quote
https://en.everybodywiki.com/List_of_8-bit_computer_hardware_graphics/archive

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

Кстати, под Timex уже есть готовые утилиты - BMP2SCR и ZX Paintbrush(.mlt)

_________________
uselessretro.blogspot.com


19 Oct 2023 10:08
Profile
Senior
User avatar

Joined: 14 Oct 2023 06:59
Posts: 157
Reply with quote
http://fornaxvoid.com/colorpalettes/
https://www.retroshowcase.gr/index.php?p=palette

_________________
uselessretro.blogspot.com


19 Oct 2023 21:06
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22784
Location: Silicon Valley
Reply with quote
Спасибо за ссылки!

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 (справа):

Attachment:
PastaGirl-Original-Uniform-Floyd.png
PastaGirl-Original-Uniform-Floyd.png [ 280.16 KiB | Viewed 11341 times ]


Attachment:
GRAYLILY-Original-Uniform-Floyd.png
GRAYLILY-Original-Uniform-Floyd.png [ 202.82 KiB | Viewed 11341 times ]


P.S. Поправил исходник: https://gitlab.com/nedopc/sprintem/-/blob/master/tools/uniformg.c?ref_type=heads

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


19 Oct 2023 21:25
Profile WWW
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22784
Location: Silicon Valley
Reply with quote
Увеличил в 2 раза, чтобы пикселы были виднее - слева палитра Uniform676 по формуле без дизеринга, справа дизеринг по Флойду-Стейнбергу с той же самой палитрой Uniform767:


Attachments:
PastaGirl-Uniform-Floyd-2X.png
PastaGirl-Uniform-Floyd-2X.png [ 137.29 KiB | Viewed 11340 times ]

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973
19 Oct 2023 22:27
Profile WWW
Senior
User avatar

Joined: 14 Oct 2023 06:59
Posts: 157
Reply with quote
Steinberg дело вкуса, но результат по мне не самый лучший. Вот такой поинтереснее.


Attachments:
dd.png
dd.png [ 11.04 KiB | Viewed 11334 times ]

_________________
uselessretro.blogspot.com
20 Oct 2023 01:25
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22784
Location: Silicon Valley
Reply with quote
Спектрумовские цвета что ли? А где знакоместа и цветной «клашинг»? ;)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


20 Oct 2023 08:38
Profile WWW
Senior
User avatar

Joined: 14 Oct 2023 06:59
Posts: 157
Reply with quote
упс, не тот конвертер :o

_________________
uselessretro.blogspot.com


20 Oct 2023 09:03
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22784
Location: Silicon Valley
Reply with quote
А вот классическая Лена (уменьшенная до 256х256) в палитре Uniform676 без дизеринга и с дизерингом по Флойду-Стейнбергу:


Attachments:
lena256x256_uniform676_without_and_with_dithering.png
lena256x256_uniform676_without_and_with_dithering.png [ 90.96 KiB | Viewed 10983 times ]

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973
25 Oct 2023 22:48
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 42 posts ]  Go to page Previous  1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.