Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
27th
Дек
Медианный фильтр прорисовки изображений через pixels Delphi
Posted by obzor under Delphi
Почему то медианный фильтр применяется не до конца изображения где то на 75% справа остаётся нетронутым примерно 25%.
Ну пока вот что вышло, не понял я какие for удалять некоторые рисунки действительно до конца стало обрабатывать некоторые та же 25% часть не хочет ):
type
TRGBArray = array[0..32767] of TRGBQuad;
PRGBArray = ^TRGBArray;
procedure Median(Bitmap:TBitmap);
var
x, y, i, j, k, buffer, buffer2, F:integer;
PixLtns:array[0..7] of Integer;
PixIndx:array[0..7] of Integer;
RowL, RowM, RowH: PRGBArray;
r1,r2,g1,g2,b1,b2:byte;
begin
for y:=1 to Bitmap.Height-2 do
begin
RowL:=Bitmap.ScanLine[y-1];
RowM:=Bitmap.ScanLine[y];
RowH:=Bitmap.ScanLine[y+1];
for x:=1 to Bitmap.Width-2 do
begin
// -
for k:=0 to 7 do PixIndx[k]:=k;
// calc lightness of surrounding 8 pixels
PixLtns[0]:=(MinIntValue([RowL[x-1].rgbRed,RowL[x-1].rgbGreen,RowL[x-1].rgbBlue])+
MaxIntValue([RowL[x-1].rgbRed,RowL[x-1].rgbGreen,RowL[x-1].rgbBlue])) div 2;
PixLtns[1]:=(MinIntValue([RowL[x].rgbRed,RowL[x].rgbGreen,RowL[x].rgbBlue])+
MaxIntValue([RowL[x].rgbRed,RowL[x].rgbGreen,RowL[x].rgbBlue])) div 2;
PixLtns[2]:=(MinIntValue([RowL[x+1].rgbRed,RowL[x+1].rgbGreen,RowL[x+1].rgbBlue])+
MaxIntValue([RowL[x+1].rgbRed,RowL[x+1].rgbGreen,RowL[x+1].rgbBlue])) div 2;
PixLtns[3]:=(MinIntValue([RowM[x-1].rgbRed,RowM[x-1].rgbGreen,RowM[x-1].rgbBlue])+
MaxIntValue([RowM[x-1].rgbRed,RowM[x-1].rgbGreen,RowM[x-1].rgbBlue])) div 2;
PixLtns[4]:=(MinIntValue([RowM[x+1].rgbRed,RowM[x+1].rgbGreen,RowM[x+1].rgbBlue])+
MaxIntValue([RowM[x+1].rgbRed,RowM[x+1].rgbGreen,RowM[x+1].rgbBlue])) div 2;
PixLtns[5]:=(MinIntValue([RowH[x-1].rgbRed,RowH[x-1].rgbGreen,RowH[x-1].rgbBlue])+
MaxIntValue([RowH[x-1].rgbRed,RowH[x-1].rgbGreen,RowH[x-1].rgbBlue])) div 2;
PixLtns[6]:=(MinIntValue([RowH[x].rgbRed,RowH[x].rgbGreen,RowH[x].rgbBlue
])+
MaxIntValue([RowH[x].rgbRed,RowH[x].rgbGreen,RowH[x].rgbBlue])) div 2;
PixLtns[7]:=(MinIntValue([RowH[x+1].rgbRed,RowH[x+1].rgbGreen,RowH[x+1].rgbBlue])+
MaxIntValue([RowH[x+1].rgbRed,RowH[x+1].rgbGreen,RowH[x+1].rgbBlue])) div 2;
//find median pixels
for j:=0 to 7 do
for k:=1 to 7-j do
begin
if PixLtns[j+k] <= PixLtns[j] then
begin
buffer:=PixLtns[j];
PixLtns[j]:=PixLtns[j+k];
PixLtns[j+k]:=buffer;
buffer2:=j;
PixIndx[j]:=PixIndx[j+k];
PixIndx[j+k]:=buffer2;
end;
end;
// get rgb values of median pixels
if PixIndx[3]=0 then
begin
r1:=RowL[x-1].rgbRed;
g1:=RowL[x-1].rgbGreen;
b1:=RowL[x-1].rgbBlue;
end;
if PixIndx[3]=1 then
begin
r1:=RowL[x].rgbRed;
g1:=RowL[x].rgbGreen;
b1:=RowL[x].rgbBlue;
end;
if PixIndx[3]=2 then
begin
r1:=RowL[x+1].rgbRed;
g1:=RowL[x+1].rgbGreen;
b1:=RowL[x+1].rgbBlue;
end;
if PixIndx[3]=3 then
begin
r1:=RowM[x-1].rgbRed;
g1:=RowM[x-1].rgbGreen;
b1:=RowM[x-1].rgbBlue;
end;
if PixIndx[3]=4 then
begin
r1:=RowM[x+1].rgbRed;
g1:=RowM[x+1].rgbGreen;
b1:=RowM[x+1].rgbBlue;
end;
if PixIndx[3]=5 then
begin
r1:=RowH[x-1].rgbRed;
g1:=RowH[x-1].rgbGreen;
b1:=RowH[x-1].rgbBlue;
end;
if PixIndx[3]=6 then
begin
r1:=RowH[x].rgbRed;
g1:=RowH[x].rgbGreen;
b1:=RowH[x].rgbBlue;
end;
if PixIndx[3]=7 then
begin
r1:=RowH[x+1].rgbRed;
g1:=RowH[x+1].rgbGreen;
b1:=RowH[x+1].rgbBlue;
end;
if PixIndx[4]=0 then
begin
r2:=RowL[x-1].rgbRed;
g2:=RowL[x-1].rgbGreen;
b2:=RowL[x-1].rgbBlue;
end;
if PixIndx[4]=1 then
begin
r2:=RowL[x].rgbRed;
g2:=RowL[x].rgbGreen;
b2:=RowL[x].rgbBlue;
end;
if PixIndx[4]=2 then
begin
r2:=RowL[x+1].rgbRed;
g2:=RowL[x+1].rgbGreen;
b2:=RowL[x+1].rgbBlue;
end;
if PixIndx[4]=3 then
begin
r2:=RowM[x-1].rgbRed;
g2:=RowM[x-1].rgbGreen;
b2:=RowM[x-1].rgbBlue;
end;
if PixIndx[4]=4 then
begin
r2:=RowM[x+1].rgbRed;
g2:=RowM[x+1].rgbGreen;
b2:=RowM[x+1].rgbBlue;
end;
if PixIndx[4]=5 then
begin
r2:=RowH[x-1].rgbRed;
g2:=RowH[x-1].rgbGreen;
b2:=RowH[x-1].rgbBlue;
end;
if PixIndx[4]=6 then
begin
r2:=RowH[x].rgbRed;
g2:=RowH[x].rgbGreen;
b2:=RowH[x].rgbBlue;
end;
if PixIndx[4]=7 then
begin
r2:=RowH[x+1].rgbRed;
g2:=RowH[x+1].rgbGreen;
b2:=RowH[x+1].rgbBlue;
end;
// gives a good but grayscale image
RowM[x].rgbRed:=(PixLtns[3]+PixLtns[4]) div 2;
RowM[x].rgbGreen:=(PixLtns[3]+PixLtns[4]) div 2;
RowM[x].rgbBlue:=(PixLtns[3]+PixLtns[4]) div 2;
end;
end;
end;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)