Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2010, 01:55   #1
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
По умолчанию Работа с пикселями на канве

Проблема с отбором пикселей на канве по коду его цвета. Вот задача: нужно на изображении *.bmp глубиной 24. по клику мышки определять код цвета пикселя по которому был клик, и потом пробежаться по изображению и закрасить все пиксели у которых не такой код в любой цвет, тоесть оставить только нужные пиксели. я делаю все вот так: определение цвета пикселя по которому был клик

Код:
procedure TForm1.Image1Click(Sender: TObject);
begin
X:=ScreenToClient(MyMouse.CursorPos).X;
Y:=ScreenToClient(MyMouse.CursorPos).Y;
Dc:=GetDC(0);
Pix1:=GetPixel(Dc, X, Y);
ReleaseDC(0, Dc);
edit6.Text:= IntToStr(Pix1);
end;
потом так пробегаю по канве image. вот так:

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
X2,Y2,z:integer;
 Dc1: HDC;
begin
for X2:=1 to image1.Picture.Width do
for Y2:=1 to image1.Picture.Height do
begin
    Dc1:=GetDC(0);
    Pix:=GetPixel(Dc1,X2,Y2);
    ReleaseDC(0,Dc1);
if Pix=Pix1 
then 
Image1.Canvas.Pixels[X2,Y2] := clBlack 
else
....
end;
теперь вопрос почему у меня вместо выделения пикселей с одним кодом прорисовывает эскиз любого окна которое под моею формою????
подскажите пожалуйста не опытному.

У нас принято оформлять код специальным тэгом - при помощи кнопочки "#".
Только...
И не значком #.
И не РНР-кодом.
И не значком цитаты.
И не собственными "ручками".
Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
Модератор

Последний раз редактировалось mihali4; 07.02.2010 в 22:23.
koshel вне форума Ответить с цитированием
Старый 06.02.2010, 14:30   #2
sergkl
 
Регистрация: 26.03.2009
Сообщений: 2
По умолчанию

При определении координат пикселя (относительно имиджа) нужно использовать методы Image1
Код:
X:=Image1.ScreenToClient(MyMouse.CursorPos ).X;
Y:=Image1.ScreenToClient(MyMouse.CursorPos ).Y;
а вы получается вызывали методы формы.

Чтоб узнать цвет пикселя используйте либо методы канвы имиджа либо контекст Dc := Image.Canvas.Handle. А вы получается для всего экрана. Ну либо тогда координаты надо тоже экранные. Проще всего так
Код:
Pix1 := Image1.canvas.Pixel[X, Y];
И при зарисовывании пикселей при щелчке кнопки тоже либо свойство канвы Image1.canvas.Pixels либо контекст получайте для Image1
Dc := Image.Canvas.Handle
т.е. вот так проверяйте
Код:
if Image1.canvas.Pixel[X2, Y2] = Pix1 then 
  Image1.Canvas.Pixels[X2,Y2] := clBlack
sergkl вне форума Ответить с цитированием
Старый 06.02.2010, 18:18   #3
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
Смех

Спасибо большое!!! исправил.
А как полученый код можно в RGB перегнать???

Код:
R:=GetBValue(Pix1);
G:=GetGValue(Pix1);
B:=GetRValue(Pix1);
так можно???

У нас принято оформлять код специальным тэгом - при помощи кнопочки "#".
Только...
И не значком #.
И не РНР-кодом.
И не значком цитаты.
И не собственными "ручками".
Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
Модератор

Последний раз редактировалось mihali4; 07.02.2010 в 22:24.
koshel вне форума Ответить с цитированием
Старый 07.02.2010, 22:13   #4
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
Вопрос

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

Вопрос: подскажите как отличить шум от нужной зоны, цвет у них один и тот же просто густота и размер разный.

Последний раз редактировалось mihali4; 07.02.2010 в 22:24.
koshel вне форума Ответить с цитированием
Старый 07.02.2010, 23:03   #5
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
По умолчанию

Спасибо уважаемый модератор в дальнейшем буду придерживаться этих правил.
koshel вне форума Ответить с цитированием
Старый 07.02.2010, 23:23   #6
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Ну есть дурацкая идея, по краям твоего "островка" сделать зачистку 5-6 пикеселей, а потом все изображение пройтись по горизонтали от самого верха до твоего островка. Потом также от самого низа вверх до твоего островка или от островка вниз, не важно. И аналогично по бокам. А "зона зачистки" просто нужна чтобы в получившемся квадрате не осталось кусочков каких-нибуть.
Zeraim вне форума Ответить с цитированием
Старый 07.02.2010, 23:43   #7
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
По умолчанию

Спасибо за идею но она не подходит, так как нужно что бы програма делала зачистку от шума по нажатию кнопки, а как прога отличит край шума от края нужной зоны, и как она поймет от чего нада пробегаться вверх и вниз влево и вправо, у них же цвет один.
У меня есть идея я только не знаю как ее реализовать: нужно по количеству пикселей определять нужную зону от не нужной, только как это реализовать я не могу понять.
koshel вне форума Ответить с цитированием
Старый 07.02.2010, 23:49   #8
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Вообще непонятно что вам надо 8) Если вам нужно оставить только некоторый выбранный участок(по цвету), который вы сами выбираете. То намного проще определить этот участок, и перерисовать на битмап чёрного цвета а потом его вывести.

Идея примерно такая: после нажатия мышки, определяется цвет, и перемещаемся вправо до границы с другим цветом, потом по часовой стрелке, как граница замкнётся, всё внутри заливаем этим же цветом и выводим.
Zeraim вне форума Ответить с цитированием
Старый 08.02.2010, 00:00   #9
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
По умолчанию

Извините если я не очень ясно выразил свою проблему. Проблема такова: Нужно на фото по цвету определить лицо человека (кликаем мышкой узнаем код пробегаем по канве закрашиваем лишние)
Код:
procedure TForm1.Image1Click(Sender: TObject);
var
X,Y :integer;
 MyMouse: TMouse;

begin
X:=Image1.ScreenToClient(MyMouse.CursorPos ).X;
Y:=Image1.ScreenToClient(MyMouse.CursorPos ).Y;

Pix1:=Image1.canvas.Pixels[X,Y];

edit1.text:=floattostr(X);
edit2.text:=floattostr(Y);
edit3.Text:=floattostr(Pix1);

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
  var
  X1,Y1: integer;
begin

for X1:=1 to image1.Picture.Width do
for Y1:=1 to image1.Picture.Height do

if Image1.canvas.Pixels[X1, Y1] = Pix1 then
else  
Image1.Canvas.Pixels[X1,Y1] := clBlack
end;
вот програма, но когда пробегаем по изображению то выясняеться что некоторые элементы фото имеют тот же цвет что и лицо (эти элементы и есть собственно шум который нужно убрать) и как мне от него избавиться??

Последний раз редактировалось koshel; 08.02.2010 в 00:03.
koshel вне форума Ответить с цитированием
Старый 08.02.2010, 00:19   #10
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Если, чистить все кусочки которые меньше определённого размера. Проходите построчно, попадается пиксель цвета лица, обшариваем его вокруг, если во время проверки радиус не большой то закрашиваем все точки которые нашли, если начинает превышать в ходе проверки то двигаемся дальше. А вообще поищите алгоритмы, думаю в интернете найдётся множество решений.
Zeraim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
цвета на канве Juffin Общие вопросы Delphi 3 17.05.2009 21:57
Проблема с пикселями!!! ТРОЯН=) HTML и CSS 1 13.03.2009 01:34
поиск по канве Bayazet Мультимедиа в Delphi 3 28.01.2009 14:52
Реализация работы с пикселями: ritm Общие вопросы Delphi 15 12.01.2009 16:59
Мерцание на Канве SERG1980 Мультимедиа в Delphi 3 30.04.2008 08:14