Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/35: Рейтинг темы: голосов - 35, средняя оценка - 4.86
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628

Сглаживание изображения

20.06.2009, 09:54. Показов 7686. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Я пишу часы, нужно написать сглаживание картинки. Пробовал брать каждый цветовой поток по отдельности, потом складывал несколько пикселей полученных таким образом.
GetRValue и т. д. - получал отдельные потоко и потом складывал и заносил в пиксели с помощью SetPixel. Работает, но очень медленно. Можно сделать через массив но я не знаю как.

Заранее спасибо!!!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.06.2009, 09:54
Ответы с готовыми решениями:

сглаживание изображения
Помогите доделать сглаживание изображения с помощью маски 3*3 int Lowpass(BYTE Image, int x, int y) { int Mask = {{1, 1,...

Сглаживание трансформированного изображения
Привет форумчане! Написал простенькую программу вращающая изображение, но при вращение, изображение, сильно портится, грубая лесенка так...

Отрисовка изображения поверх канвы (изображения) и вращение изображения
Здравствуйте. Столкнулся с 2умя проблемами при работе с изображениями средствами C++ Builder. Хочу сделать одну интересную штуку, но...

23
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
20.06.2009, 11:46
VtaMC,
Цитата Сообщение от VtaMC Посмотреть сообщение
Я пишу часы, нужно написать сглаживание картинки. Пробовал брать каждый цветовой поток по отдельности, потом складывал несколько пикселей полученных таким образом.
Как это было?
C++
1
DoubleBuffered=true;
пробовал?
0
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
20.06.2009, 12:03  [ТС]
Сейчас попробую.

А вот сам код:
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void antialiasing()
{
int n1, n2,n3, o1,o2,o3, h1,h2,h3, t1,t2,t3, l1,l2,l3,n777;
HDC BitMP = Form14->Image1->Canvas->Handle;
int x, y, i = 0, nor = 0;
x = 500;
y = 500;
do
{
    do
    {
    n1 = GetRValue(GetPixel(BitMP,i,nor));
    n2 = GetGValue(GetPixel(BitMP,i,nor));
    n3 = GetBValue(GetPixel(BitMP,i,nor));
 
    h1 = GetRValue(GetPixel(BitMP,i,nor-1));
    h2 = GetGValue(GetPixel(BitMP,i,nor-1));
    h3 = GetBValue(GetPixel(BitMP,i,nor-1));
 
    o1 = GetRValue(GetPixel(BitMP,i-1,nor));
    o2 = GetGValue(GetPixel(BitMP,i-1,nor));
    o3 = GetBValue(GetPixel(BitMP,i-1,nor));
 
    t1 = GetRValue(GetPixel(BitMP,i,nor+1));
    t2 = GetGValue(GetPixel(BitMP,i,nor+1));
    t3 = GetBValue(GetPixel(BitMP,i,nor+1));
 
    l1 = GetRValue(GetPixel(BitMP,i+1,nor));
    l2 = GetGValue(GetPixel(BitMP,i+1,nor));
    l3 = GetBValue(GetPixel(BitMP,i+1,nor));
    SetPixel(BitMP,i - 1,nor, RGB( (n1+o1+h1+t1+l1)/5 ,(n2+o2+h2+t2+l2)/5 ,(n3+o3+h3+t3+l3)/5));
    i++;
    }
    while(i <= x);
    i = 0;
    nor++;
}
while(nor <= y);
}
Добавлено через 9 минут 27 секунд
C++
1
DoubleBuffered=true;
Это не помогло.

Выставляю PixelFormat на pf24 bit.
Становится чуть быстрее... Но всёравно для такой активной перерисовки графики как в часах слишком долго...
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
20.06.2009, 12:14
VtaMC,
Цитата Сообщение от VtaMC Посмотреть сообщение
Можно сделать через массив
нужно вычислять все три составляющие rgb
C++
1
2
3
for(int r  = rR - 1;  r <= rR; r++)
for(int c = cR - 1; c <= cR; c++)
colorR = colorR + RValue[i + r][j + c]*Filter[r + 1][c +1];//int Filter
шото-типа
1
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
20.06.2009, 12:21  [ТС]
А можно более полный пример, не могу разобраться...
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
20.06.2009, 12:21
далее colorR разделить на 8 или на 9(непомню!)
VtaMC,
Цитата Сообщение от VtaMC Посмотреть сообщение
часы... сглаживание
а картинку можно поместить на TImage и забыть о сглаживании.
0
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
20.06.2009, 12:24  [ТС]
а у меня картинка и есть на TImage...
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
20.06.2009, 12:40
я брал область пикселей и фильтровал
C++
1
int r[0xff][0xff] = ....
Цитата Сообщение от VtaMC Посмотреть сообщение
n1 = GetRValue(GetPixel(canvas->Pixel[i][j]));
как взять значение rgb ты знаешь!
А ты на втором Имадже.
А у первого фон сделай прозрачным.

Добавлено через 1 минуту 34 секунды
можешь вообще -> фон == Form->Canvas

Добавлено через 1 минуту 12 секунд
можешь вообще == фон == Form1-Canvas

Добавлено через 4 минуты 21 секунду
баги!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Модераторы, Добрый день!
Удалить последний стерео-баговый дубль моно?
И этат тожа!(если моно!)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.06.2009, 12:44
Все так долго потому что используется canvas->Pixel[i][j]. Для того, чтобы было нааамного быстрее нужно использовать Scanline;
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
20.06.2009, 12:55
Otaka!
А сглаживание через

Цитата Сообщение от Otaka Посмотреть сообщение
Scanline;
пикселей возможно?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.06.2009, 13:05
Так ведь сглаживание - это взять пиксели сложить цвета и разделить, а потом поместить результирующий пиксель. GetPixel и SePixel работают оочень медленно, потому-то все так медленно. Нужно заменить их на более быстрые процедуры.
Я всегда делаю так. У меня для этого дела есть класс ExtImage.
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class ExtImage:public TBitmap
{
char*myscanline;
int lasty;//Для сканлайна
public:
void Load(String path)
        {
        lasty=-1;
        String ext=ExtractFileExt(path).UpperCase();
        if(ext==".JPEG" || ext==".JPG")
                {
                TJPEGImage*im=new TJPEGImage();
                im->LoadFromFile(path);
                Assign(im);
                delete im;
                }else
                {
                LoadFromFile(path);
                }
        }
void DrawTo(HDC handle,int x,int y)
        {
        BitBlt(handle,x,y,Width,Height,Canvas->Handle,0,0,SRCCOPY);
        }
__inline unsigned char*GetPixels(int x,int y)
     {
     if(y!=lasty)
          {
          myscanline=(char*)ScanLine[y];
          lasty=y;
          }
     return &myscanline[x+x+x];
     }
__inline void SetPixel(int x,int y,int r,int g,int b)
     {
     if(y!=lasty)
          {
          myscanline=(char*)ScanLine[y];
          lasty=y;
          }
     UCHAR*p= &myscanline[x+x+x];
     p[2]=(UCHAR)r;
     p[1]=(UCHAR)g;
     p[0]=(UCHAR)b;
     }
__inline GetLuminosity(int x,int y)
     {
     unsigned char*c=(unsigned char*)ScanLine[y];
     c=&c[x+x+x];
     return (c[2]*77 + c[1]*151 + c[0]*28) >> 8;
     }
void StretchDrawTo(HDC handle,LPRECT rect,float Angle)
        {
        SetStretchBltMode(handle,STRETCH_HALFTONE);
 
        if(Angle==0)
                {
                StretchBlt(handle,rect->left,rect->top,rect->right-rect->left,rect->bottom-rect->top,
                   Canvas->Handle,0,0,Width,Height,SRCCOPY);
                }else
                {
                Angle=Angle*0.017453292;
                Angle=-Angle;
                XFORM Matrix;
                SetGraphicsMode(handle, GM_ADVANCED);
                Matrix.eM11 = 1;
                Matrix.eM12 = 0;
                Matrix.eM21 = 0;
                Matrix.eM22 = 1;
                Matrix.eDx = -rect->left;
                Matrix.eDy = -rect->top;
                SetWorldTransform(handle, &Matrix);
                Matrix.eM11 = cos(Angle);
                Matrix.eM12 = sin(Angle);
                Matrix.eM21 = -sin(Angle);
                Matrix.eM22 = cos(Angle);
                Matrix.eDx = 0;
                Matrix.eDy = 0;
                ModifyWorldTransform(handle, &Matrix, MWT_RIGHTMULTIPLY);
                Matrix.eM11 = 1;
                Matrix.eM12 = 0;
                Matrix.eM21 = 0;
                Matrix.eM22 = 1;
                Matrix.eDx = rect->left;
                Matrix.eDy = rect->top;
                ModifyWorldTransform(handle, &Matrix, MWT_RIGHTMULTIPLY);
 
                StretchBlt(handle,rect->left,rect->top,rect->right-rect->left,rect->bottom-rect->top,
                   Canvas->Handle,0,0,Width,Height,SRCCOPY);
                ModifyWorldTransform(handle, &Matrix, MWT_IDENTITY);
                }
        }
};
Грузим в него рисунок, выставляем pixelformat на 24 бита, а потом GetPixels(x,y) вернет нам массив из 3 элементов(color[0]-синий, color[1]-зеленый, color[2]-красный). Изменяя значения в этом массиве мы изменяем значения в картинке. Главное не напортачить, так как проверок на ошибки практически нету(это я разбирался с этим, чтобы ловить картинку с камеры, и находить там карты).
2
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
20.06.2009, 14:28
Otaka,

это я не тебе.
C++
1
2
3
4
5
ShowMessage("Диск           = " + ExtractFileDrive (allFileName) +
            "Каталог        = " + ExtractFileDir   (allFileName) +
            "Путь           = " + ExtractFilePath  (allFileName) +
            "Имя            = " + ExtractFileName  (allFileName) +
            "Расширение     = " + ExtractFileExt   (allFileName));
Цитата Сообщение от Otaka Посмотреть сообщение
Главное не напортачить
классно подмечено.
Спасибо!
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.06.2009, 14:32
Вот я тут попробовал смастерить, две функции сглаживания(они практически одинаковые, в Smooth2 повыкидывал все проверки, поэтому чуточку быстрее работает), однако все равно большие рисунки обрабатывает довольно долго:'(
Вложения
Тип файла: rar Smooth.rar (3.6 Кб, 64 просмотров)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.06.2009, 14:34
Для таких делов вероятно проще использовать готовые решения написанные на ассемблере с использованием mmx и подобных суппер-пуппер команд, которых я не знаю.
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
20.06.2009, 15:06
Otaka,
Извиняюсь за наглость!
А де - "во тэ та" дел?
C++
1
#include <myclasses.cpp>
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.06.2009, 15:19
Звиняюсь, забыл.
Чуть-чуть еще переделал. Стало еще чуточку быстрее работать, но все равно медленно.
Хотя это и изобретение велосипеда, но все же интересно, и я думаю полезно.
Вложения
Тип файла: rar Smooth.rar (12.0 Кб, 79 просмотров)
1
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
20.06.2009, 15:57
Otaka,
Цитата Сообщение от Otaka Посмотреть сообщение
но все равно медленно
C++
1
DoubleBuffered=true;
No! Normal!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::FormDblClick(TObject *Sender)
{
    ExtImage*im=new ExtImage();
im->Load("bmpOtakaSmooth.JPG");
im->PixelFormat=pf24bit;
Form1->Left = 0x0000000000000000;
Form1->Top  = 0x0000000000000000;
Form1->ClientWidth = im->Width;
Form1->ClientHeight= im->Height;
im->DrawTo(Canvas->Handle,0,0);
TCounter c;
im->Smooth();
im->DrawTo(Canvas->Handle,0,0);
Caption="Smooth "+(IntToStr(c.Process()))+" мс";
}
//---------------------------------------------------------------------------
double "*.JPG"
эффект достигнут
Цитата Сообщение от VtaMC Посмотреть сообщение
Сглаживание изображения
Миниатюры
Сглаживание изображения  
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.06.2009, 16:02
Хорошо. А окончательный проектик посмотреть можно?
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
20.06.2009, 16:31
Otaka,
часы как раз примитивные!
И в другой теме!
https://www.cyberforum.ru/cpp-... post198709

Не по теме:

Manifik - в переводе с французского - великолепно.


А там неManifik!
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.06.2009, 16:34
Понятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2009, 16:34
Помогаю со студенческими работами здесь

сглаживание ellipse
Доброго времени , коллеги! Такой еще вопрос. Как решить вопрос сглаживания ellipse ...

Сглаживание графика / интерполяция
Всем доброго времени суток =) В своей программе рисую график функции, заданный точками. Вот код: void Chart::DrawGraphic() { int xx =...

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

Изменение яркости контрастности изображения. Бинаризация изображения
Товарищи программисты помогите с разработкой алкоритма для изменеие яркости контрастности изображения, а токже осуществить бинаризацию...

Сглаживание изображения
Ребята, есть проблема, не знаю, как её решить уже долгое время. Разберём на картинке, что во вложениях: Картинка под номером 1...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 31.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 30.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru