Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как можно выпрямить круглое изображение?  (Прочитано 19893 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 02-05-2006 09:31 » 

Вот допустим есть бублик, на нем написано слово, нужно чтобы этот бублик стал прямоугольником и слово не испортилось.
Есть какие нибудь алгоритмы для реализации сабжа?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #1 : 02-05-2006 09:41 » 

... ну прямоугольник в сферических координатах и есть бублик (вроде бы)... то есть переход из сферических к декартовым координатам тебе и нужен.
Записан

Удачного всем кодинга! -=x[PooH]x=-
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 02-05-2006 09:53 » 

Сферические координаты это по моему для двухмерного случая - радиус, угол... Чет не пойму как этим можно бублик развернуть...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #3 : 02-05-2006 10:25 » 

Угол- Х, Радиус-Y

Только, не совсем понятно, что есть "бублик" - сечение тора? и что значит:
Цитата
слово не испортилось

и как именно:
Цитата
на нем написано слово
Записан

Удачного всем кодинга! -=x[PooH]x=-
Alf
Гость
« Ответ #4 : 02-05-2006 12:02 » 

Вроде бы задача решается двумя простыми преобразованиями в цилиндрических координатах:

1. Разрезать тор и распрямить его в цилиндр.
2. Разрезать цилиндр вдоль образующей и раскатать его в прямоугольник.

Кстати, в каком виде задано исходное изображение?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 02-05-2006 12:41 » 

Я думаю, тут может быть две ситуации - 1. Когда мы имеем 3Д объекты - тор, на который "натянут" текст. В этом случае ничего делать не надо. Надо только вытащить текст и всё.
2. Изображение ужу отрендрено и мы имеем дело с матрицей точек, я думаю что в самом общем случае получить "неиспорченный" текст будет невозможно. Можно попытаться сделать OCR на торе.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #6 : 03-05-2006 02:20 » new

Исходное изображение в виде битмапа-представляет собой плоский бублик), нарисовано на нем может быть все что угодно нужно его развернуть в прямоугольник.
Можно ли это сделать стандартными средствами GDI или побитно переносить и растягивать придется?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 03-05-2006 12:37 » 

Стандартными средствами GDI однозначно нельзя. Жаль Если качество хорошее можно попрообовать OCR сделать на бублике и работать с нормальным текстом. А так... Может с OpenGL попробовать, но я с ней не игрался.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 04-05-2006 02:25 » 

А спомощью регионов CRgn тоже ничего не получится?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #9 : 04-05-2006 05:37 » 

USBLexus, дай примеры изображений исходного и итогового
Записан

Удачного всем кодинга! -=x[PooH]x=-
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 04-05-2006 08:53 » 

USBLexus, не могу себе прдеставить - как? Я вижу такое аналитическое решение:
сначала тебе надо из "плоского" рисунка восстановить криволинейную поверхность. Что само по себе автоматическим способом не решается. Подобные программы всегда требуют участия человека, который  "натягивает" на рисунок сетку. Другого способа нет и быть не может. Только человек может определить объёмность плоского рисунка.

Оффтоп (но может поможет сэкономить время не поиски решения, которого скорее всего нет)

Несколько лет назад было у нас предложение сделать нечто подобное - одной фирме нужна была прога, которая позволяла бы на фотографиях клиента (фотки мебели и интерьера) менять цвета и текстуру. Наример, на фотке изображена комната с мебелью. Ты можешь поменять оббивку мебели, оббои, пол, потолок и тд. Те производителю не надо делать сразу 50-100 разных фоток, а достаточно только одной. Потом в интерактивной среде желающие могли посмотреть, как это будет выглядеть в разных цветах. Проект был многообещающим и интересным. На тот момент они решали задачу довольно просто - у них был тул, с помощью которого специально обученный человек "натягивал" сетку на фотографию. Потом эта сетка сохранялась в удобоваримом формате для другой проги (тут не знаю, что-нить типа 3D studio MAX) и уже в ней на эту сетку можно было накладывать другие текстуры. Я вроде уже рассказывал про это. У них даже сайт был (может и ща есть, попробую найти)
Там можно было посмотреть как это работает. Конечно на спец. подоготовленных фотках.
В итоге ничего не получилось. Самую ответственную и кропотливую часть - натягивание сетки - автоматизировать (читай "сделать программно") было нельзя. От точности и подробности этой сетки зависело качество результата. Думаю и по сей день они работают по этой схеме.
На сегодняшний день (насколько я знаю) все подобные операции проводятся вручную и в 3д прогах (3D studio MAX, Maya), и в плагинах-фильтрах Фотошопа.

Из "не монстров" можешь посмотреть прогу REALVIZ ImageModeler
http://realviz.com/products/im/index.php

Тоже делается ручками. Жаль
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #11 : 04-05-2006 09:30 » 

Ну чтото типа этого
http://irida.city.tomsk.net/primer.jpg
Правда здесь текстура не выровнена, в идеале надо выравнивать пока кроме как переносить все это из круга в прямоугольник по битам я ничего не придумал((
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Alf
Гость
« Ответ #12 : 04-05-2006 09:33 » 

Так на самом деле имеется в виду объемный бублик или плоское кольцо?
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #13 : 04-05-2006 09:50 » 

Исходное изображение в виде битмапа-представляет собой плоский бублик), нарисовано на нем может быть все что угодно нужно его развернуть в прямоугольник.
Можно ли это сделать стандартными средствами GDI или побитно переносить и растягивать придется?
Вот
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 04-05-2006 09:59 » 

"Плоский бублик" - это как? Или всё-таки кольцо? Типа СДшного лейбла?

Известно как оно было сделано? Или другими словами - чему должна быть равна ширина результата? Длинне внешней окружности, или длинне внутренней окружности?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #15 : 04-05-2006 10:07 » 

Ну плоский бублик это типа его взяли и сплющили кирзовым сапогом) и он приобрел форму компакт диска или кольца и тд... Ширина результата должна быть=длине внешней окружности в этом тоже проблемма поскольку некоторые биты придется "растягивать". Как это сделать "ручками" я в принципе уже придумал, но хочется найти стандартный метод
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #16 : 04-05-2006 11:34 » 

... я стандартных не знаю... только по пиксельно.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 04-05-2006 12:38 » 

Да уж, лучше бы было внутренней, тогда надо было бы просто лишние удалить. Жаль

Я тоже стандартных не знаю. Скорее всего их нет. Думаю тебе надо посмотреть алгоритмы разворачивания глобуса в карту. На algolist смотрел?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #18 : 04-05-2006 12:47 » 

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

Удачного всем кодинга! -=x[PooH]x=-
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #19 : 04-05-2006 13:21 » 

вот, собственно, весь (тока на дельфях):
Image1 - оригинал, Image2- итог

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
    ox,oy:integer;
    alfa,aux:Extended;

begin
  Image2.Height:=round(Image1.Height/2);
  Image2.Width:=round(2*PI*Image2.Height);
  for i := 1 to Image2.Width do
    for j := 1 to Image2.Height do
    begin
      aux:=i/Image2.Width;
      alfa:=-2*pi*(aux)-PI/2;
      ox:= round(Image1.Width/2+ j* cos(alfa));
      oy:= -1*round(j* sin(alfa)- Image1.Height/2);
      Image2.Canvas.Pixels[i,Image2.Height-j]:=Image1.Canvas.Pixels[ox,oy]
    end;
end;

из рисунка по ссылке (у меня почему-то небольшой овал) получается:

* itog.gif (11.88 Кб - загружено 1510 раз.)
« Последнее редактирование: 04-05-2006 13:25 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
Sands
Помогающий

ua
Offline Offline

« Ответ #20 : 04-05-2006 20:24 » 

PooH предложил неплохой метод, как вариант можно рассмотреть следующую идею:
1) длинну результирующего изображения определять исходя из какого либо алгоритма рисования  окружности(к примеру Брезенхема(сразу сорри если неправильно напечатал фамилию, просто встречал 3 или 4 трактовки))
2) построить обратное преобразование из декартовой системы координат в полярную
3) по етому преобразованию проставить все пиксели, которые есть, а те которых будет не хватать определять методами апроксимации(сплайн там или среднеквадратическое приближение)

таким образом по идее можно гарантировать, что кольцо в 1 пиксель будет разворачиваться в прямую, а бублик, соответственно в прямоугольник
А PooH'у сенкс еще раз
« Последнее редактирование: 06-12-2007 17:57 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines