Аватар для zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156

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

07.10.2010, 23:46. Показов 2127. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru