С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156

Вектор интенсивности пикселов

07.10.2010, 23:46. Показов 2076. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, господа ученые!
Подскажите как составить вектор желательно интенсивности пикселов картинки JPG. Причем картинки двух типов: цветные (24 битные) и чернобелые (8 битные) конечноже разных размеров. Не могу разобраться(
Думаю нужно сначало проверить на то какая картинка на входе (24 или 8) а потом если 24 привести ее к 8 битной и смотреть на интенсивность каждого пиксела, поле чего найти занчение вектора (гистограммы) соответствующей интенсивности и увеличить его.
В 24 разрядных картинках я так по каналу на каждый цвет. Поэтому вопрос состоит в том как 24 = > 8 и потом если я все правильно понял можно смотреть уже не на интенсивность пикселя а на его цвет
Pascal
1
Image1.Picture.Bitmap.Canvas.Pixels[x,y]
(из предыдущих сообщений)
Так как же?????
спасибо, если кто ответит!

Добавлено через 1 час 11 минут
ну подскажите хоть почему не работает вот такой перевод в чернобелое изображение??
компрессию проходит нормально , но только если загружать BMP файл, тогда сохраняется в JPG формате и даже видно как страдает качество.. а вот при установке чека, ничего не происходит: файл создается но у него нулевой размер и не открывается((
да и потом мне нужно все равно приводить к 8 битному изображению. таким методом что получится??)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.execute then
    image1.Picture.LoadFromFile(OpenPictureDialog1.filename);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var jpg:TJpegImage;
begin
jpg:=TJpegImage.Create;
jpg.Assign(image1.picture.graphic);
jpg.CompressionQuality:=TrackBar1.Position;
jpg.Grayscale:=checkbox1.Checked;
//jpg.Compress;
jpg.SaveToFile('D:\first.jpg');
jpg.free;
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2010, 23:46
Ответы с готовыми решениями:

Как адаптировать медиазапросами если макет 1920 пикселов,а мой экран 1366 пикселов?
Как адаптировать медиазапросами если макет 1920 пикселов,а мой экран 1366 пикселов? Я например, просто отдалял колесиком мышки...

GDI HBITMAP и массив пикселов
Здравствуйте. Подскажите такую вещь: у меня есть массив пикселов. Как его прикрутить к объекту HBITMAP? Как делать наоборот разобрался, а...

Загрузка в программу матрицы пикселов.
Не секрет, что камнем преткновения для многих программистов в вопросе обработки рисунков является отсутствие знаний об формате рис....

11
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
08.10.2010, 11:12
Подскажите как составить вектор желательно интенсивности пикселов картинки JPG.
Что ты понимаешь под вектором интенсивности?
ну подскажите хоть почему не работает вот такой перевод в чернобелое изображение??
Строка jpg.Grayscale:=checkbox1.Checked; должна быть перед jpg.Assign(image1.picture.graphic);
0
 Аватар для zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
08.10.2010, 11:52  [ТС]
для 8 битного расунка проблему решил так вот:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type
  THistogramArray = array [0..255] of Integer;
 
procedure TForm1.btn1Click(Sender: TObject);
var
  Hist: THistogramArray;
  bmp: TBitmap;
  j,i :integer;
  p:byte;
begin
  if dlgOpenPic1.Execute() then
    begin
      for i:=0 to 255 do hist[i]:=0;
      img1.Picture.LoadFromFile(dlgOpenPic1.FileName);
      bmp:=TBitmap.Create;
      bmp.Assign(img1.Picture.Graphic);
      
      if  [B]Bmp.PixelFormat = pf8bit[/B] then begin
        for i := Bmp.Height-1 downto 0 do begin
          for j := bmp.Width-1 downTo 0 do begin
            p := Bmp.Canvas.Pixels[i,j];
            hist[p]:= hhist[p]+1;
            end;
          end;
        end;
а вот для 24 битного как ??
Delphi
1
2
if  [B]Bmp.PixelFormat = pf24bit[/B] then
      ...
Добавлено через 3 минуты
Цитата Сообщение от x128 Посмотреть сообщение
Строка jpg.Grayscale:=checkbox1.Checked; должна быть перед jpg.Assign(image1.picture.graphic);
а при переводе в Grayscale разрядность меняется??

Добавлено через 31 минуту
сохраняет в 8 битном) проверил! но только если выполнен /jpg.Compress;
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
08.10.2010, 14:13
а вот для 24 битного как ??
Смотря, что тебе нужно, либо считай гистограмму для каждого канала, либо только для яркости. И еще, для битмапа pf8bit не означает, что он в градациях серого... если в твоем случае это однозначно так, вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.Button1Click(Sender: TObject);
var
  hist: array[0..255] of cardinal;
  bmp: TBitmap;
  x,y: integer;
  scan: pByteArray;
  gray: boolean;
begin
  if OpenPictureDialog1.Execute then begin
    image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    bmp:=TBitmap.Create;
    bmp.Assign(image1.Picture.Graphic);
    gray:=bmp.PixelFormat=pf8bit;
    bmp.PixelFormat:=pf24bit;
    FillChar(hist, 256*SizeOf(Cardinal), 0);
    for y:=0 to bmp.Height-1 do begin
      scan:=bmp.ScanLine[y];
      for x:=0 to bmp.Width-1 do
        if gray then inc(hist[scan[x*3]])
        else inc(hist[round(scan[x*3+2]*0.299+scan[x*3+1]*0.578+scan[x*3+0]*0.114)]);
    end;
    bmp.Free;
  end;
end;
1
 Аватар для zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
08.10.2010, 14:26  [ТС]
Цитата Сообщение от x128 Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
    
    gray:=bmp.PixelFormat=pf8bit;
    bmp.PixelFormat:=pf24bit;
    FillChar(hist, 256*SizeOf(Cardinal), 0);
    for y:=0 to bmp.Height-1 do begin
      scan:=bmp.ScanLine[y];
      for x:=0 to bmp.Width-1 do
        if gray then inc(hist[scan[x*3]])
        else inc(hist[round(scan[x*3+2]*0.299+scan[x*3+1]*0.578+scan[x*3+0]*0.114)]);
    end;
    bmp.Free;
  end;
end;
простите за мою "тупость" и навязчивость, но не могли бы вы пояснить " scan[x*3+2]*0.299 " точнее, зачем х-овую координату в массиве умножать на три а потом еще плюсовать по единице???
если честно, то никак не могу найти толкового обьяснения для сканлайна( , а 0.229 я так понял это коэффициент для правельного перевода в серое?
я так думаю это обращение к каналу цвета, но как тогда этот массив представить??
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
08.10.2010, 16:16
зачем х-овую координату в массиве умножать на три
В битмапе при pf24bit один пиксель состоит из трех байт (rgb), а scan это указатель на массив байт и для правильного вычисления адреса пикселя в строке изображения значение х нужно умножить на 3. Можно конечно Scanline рассматривать как массив триплетов, но мне так привычней.
а 0.229 я так понял это коэффициент для правельного перевода в серое?
Все верно (0.299R+0.578G+0.114B)
1
 Аватар для zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
12.10.2010, 19:58  [ТС]
простите, а вот эти два варианта эквиваленты для дальнейшей обработки?
т.е. на форме не должно быть имэйджа, а назначение битмапу "image1.Picture.Graphic" и "Bmp.Assign(Jpg);" не повлияетли на исход вектора интенсивности?? т.е. Picture.Graphic это тоже самое что назначить JPG??

Delphi
1
2
Jpg.LoadFromFile(DirectoryListBox1.Directory + '\'+SR.name);
Bmp.Assign(Jpg);
...

Delphi
1
2
3
image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    bmp := TBitmap.Create;
    bmp.Assign(image1.Picture.Graphic);
..
Delphi
1
2
3
4
5
6
7
8
9
10
 gray := bmp.PixelFormat=pf8bit;
    bmp.PixelFormat := pf24bit;
    FillChar(hist, 256*SizeOf(Cardinal), 0);
    for y := 0 to bmp.Height-1 do begin
      scan := bmp.ScanLine[y];
      for x := 0 to bmp.Width-1 do
        if gray then inc( hist[scan[x*3]] )
        else inc( hist[round(scan[x*3+2]*0.299 + scan[x*3+1]*0.578 + scan[x*3+0]*0.114)] );
    end;
    bmp.Free;
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
12.10.2010, 20:20
Оба варианта эквивалентны, на результат вычислений не повлияет.
1
 Аватар для zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
23.10.2010, 18:35  [ТС]
Цитата Сообщение от zybrzybr Посмотреть сообщение
for y := 0 to bmp.Height-1 do begin
scan := bmp.ScanLine[y];
for x := 0 to bmp.Width-1 do
if gray then inc( hist[scan[x*3]] )
else inc( hist[round(scan[x*3+2]*0.299 + scan[x*3+1]*0.578 + scan[x*3+0]*0.114)] );
end;
простите а вот тут if gray then inc( hist[scan[x*3]] ) надо разве "х*3"?
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
24.10.2010, 10:21
Умножение нужно т.к. битмап приводится к 24 битам.
1
 Аватар для zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
24.10.2010, 18:12  [ТС]
Цитата Сообщение от x128 Посмотреть сообщение
Умножение нужно т.к. битмап приводится к 24 битам.
сделал картинку 8 битную 4х4 черного цвета и посмотрел на вектор, вобщем при умножении на "3" в ответе получается что один пиксел черый и все а убрал умножение получил 16. наверное потомучто мы не непосредственно обращаемся к битмапу а на указатель.
так а если битмап по три байта на пиксел, а картинка 8 битовая, то чем забивается остальные два байта ?? из эксперемента видно что либо битмап отвел по байту на пиксел если в него загружена 8битная картинка либо я все еще не понял суть указателя(
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
24.10.2010, 19:37
В примере который я давал было явное приведение к 24 битам (PixelFormat:=pf24bit), соответственно каждый пиксел будет представлен тремя байтами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.10.2010, 19:37
Помогаю со студенческими работами здесь

Получить массив пикселов IMG
Здравствуйте. Могу ли я получить массив пикселов IMG, к примеру? Пусть я отобразил изображение, нужно воспользоваться специфическим...

Почему добавляется 8 пикселов под картинкой?
Сабж http://jsfiddle.net/donsanchez/52aZx/ <!DOCTYPE html> <div class="w25"> <img...

Прямоугольник 10 пикселов. Подскажите кто может
Всем добрый вечер! Скажите пожалуйста, вот столкнулся с такой задачей, что надо написать приложение, чтобы в оке отображался...

Определение количества пикселов красного цвета на Image
Как определить количество пикселов красного цвета на Image? Как получить цвет каждого пиксела в цикле for и проверить его на соответствие...

Не прорисовывается последняя строка пикселов в объекте TImage
Коллеги! Столкнулся с малопонятной проблемой. Необходимо заполнить объект TImage линиями разной длины (заданы в массиве X) по всей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru