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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2018, 13:07   #1
tyoma_fatom
Новичок
Джуниор
 
Регистрация: 06.04.2018
Сообщений: 2
По умолчанию Помогите, пожалуйста, перевести код

Помогите, пожалуйста, перевести код с С++ на делфи, вроде бы как-то потихоньку переводил, но всё равно было очень много ошибок.

Код:
void Bradley_threshold(unsigned char* src, unsigned char* res, int width, int height) {
  const int S = width/8;
  int s2 = S/2;
  const float t = 0.15;
  unsigned long* integral_image = 0;
  long sum=0;
  int count=0;
  int index;
  int x1, y1, x2, y2;

  //рассчитываем интегральное изображение 
  integral_image = new unsigned long [width*height*sizeof(unsigned long*)];
  
  for (int i = 0; i < width; i++) {
    sum = 0;
    for (int j = 0; j < height; j++) {
      index = j * width + i;
      sum += src[index];
      if (i==0)
	integral_image[index] = sum;
      else
	integral_image[index] = integral_image[index-1] + sum;
    }
  }
  
//находим границы для локальные областей
  for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j++) {
      index = j * width + i;
      
      x1=i-s2;
      x2=i+s2;
      y1=j-s2;
      y2=j+s2;
      
      if (x1 < 0)
	x1 = 0;
      if (x2 >= width)
	x2 = width-1;
      if (y1 < 0)
	y1 = 0;
      if (y2 >= height)
	y2 = height-1;
      
      count = (x2-x1)*(y2-y1);
      
      sum = integral_image[y2*width+x2] - integral_image[y1*width+x2] -
				  integral_image[y2*width+x1] + integral_image[y1*width+x1];
      if ((long)(src[index]*count) < (long)(sum*(1.0-t)))
	res[index] = 0;
      else
	res[index] = 255;
    }
  }
  
  delete[] integral_image;
}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 06.04.2018 в 13:18.
tyoma_fatom вне форума Ответить с цитированием
Старый 07.04.2018, 09:26   #2
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Код:
procedure Bradley_threshold(src,res:string;width,height:integer);
var s,s2,sum,count,index,x1,y1,x2,y2,i,j:integer;
    t:real;
    integral_image:array of integer;
begin
  S:=width div 8;
  s2:=S div 2;
  t:=0.15;
  SetLength(integral_image,0);
  sum:=0;
  count:=0;

  //рассчитываем интегральное изображение
  SetLength(integral_image,width*height*sizeof(longint));

  For i:=0 to width-1 do
  begin
    sum:=0;
    For j:=0 to height-1 do
    begin
      index:=j*width+i;
      sum:=sum+Ord(src[index]);/// какого типа переменная src ???
      if (i=0) then
	integral_image[index]:=sum
      else
	integral_image[index]:=integral_image[index-1]+sum;
    end;
  end;
  
//находим границы для локальные областей
  For i:=0 to width-1 do
  begin
    For j:=0 to height-1 do
    begin
      index:=j*width+i;

      x1:=i-s2;
      x2:=i+s2;
      y1:=j-s2;
      y2:=j+s2;

      if (x1 < 0) then
	x1:= 0;
      if (x2 >= width) then
	x2:= width-1;
      if (y1 < 0) then
	y1:= 0;
      if (y2 >= height) then
	y2:= height-1;

      count:= (x2-x1)*(y2-y1);

      sum:= integral_image[y2*width+x2] - integral_image[y1*width+x2] -
				  integral_image[y2*width+x1] + integral_image[y1*width+x1];
      if Ord(src[index])*count < (sum*(1.0-t)) then
	res[index] := #0 // тоже уточнить какого типа переменная res ???
      else
	res[index] := #255;
    end;
  end;
end;
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 08.04.2018, 12:37   #3
tyoma_fatom
Новичок
Джуниор
 
Регистрация: 06.04.2018
Сообщений: 2
По умолчанию

А можете помочь, пожалуйста. А как эту процедуру(которую перевили из С++ в делфи, которая выше) применить именно для изображения? В бинаризации изображения есть несколько алгоритмов. Вот пример алгоритма, который у меня работает с изображение
Код:
procedure dsBinarizeBMP(BMP: TBitmap; const aMid: Byte = 127);
type T3b = array[0..2] of byte;
     P3b = ^T3b;
var  i, j: Integer;
     f3b: P3b;
begin
  BMP.PixelFormat := pf24bit;
  for i:=0 to pred(BMP.Height) do
    begin
      f3b := BMP.ScanLine[i];
        for j := 0 to pred(BMP.Width) do
          begin
            if (((f3b^[0]+f3b^[1]+f3b^[2]) div 3)> aMid) then f3b^[0]:= 255
            else
              f3b^[0] := 0;
              f3b^[1] := f3b^[0];
              f3b^[2] := f3b^[0];
                if (j < pred(BMP.Width)) then
                inc(f3b);
          end;
   end;
end;


  procedure TForm1.btn1Click(Sender: TObject);
begin
  Img1.Picture.Bitmap.LoadFromFile(dlgopenpic1.filename);
  dsBinarizeBMP(Img1.Picture.Bitmap);
end;

Последний раз редактировалось tyoma_fatom; 08.04.2018 в 12:40.
tyoma_fatom вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста перевести код с Pascal в Си Saruman! Фриланс 3 28.05.2017 23:13
Помогите пожалуйста перевести код из Delphi в C++ Builder. Какие тут ошибки? Alina96 Помощь студентам 0 05.04.2017 22:55
Помогите пожалуйста перевести код программы из Паскаля в Делфи svend Помощь студентам 3 20.03.2016 10:14
помогите перевести код Pascal в код Lazarus Ляйсан9517 Lazarus, Free Pascal, CodeTyphon 13 22.05.2014 17:19