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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2021, 05:43   #1
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию Медианный фильтр не до конца - применяется не до конца изображения где то на 75% справа остаётся нетронутым примерно 25%

Здрасте, почему то медианный фильтр применяется не до конца изображения где то на 75% справа остаётся нетронутым примерно 25%

Код:
type
  TRGBArray = array[0..32767] of TRGBTriple;
  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].rgbtRed,RowL[x-1].rgbtGreen,RowL[x-1].rgbtBlue])+
MaxIntValue([RowL[x-1].rgbtRed,RowL[x-1].rgbtGreen,RowL[x-1].rgbtBlue])) div 2;
PixLtns[1]:=(MinIntValue([RowL[x].rgbtRed,RowL[x].rgbtGreen,RowL[x].rgbtBlue])+
MaxIntValue([RowL[x].rgbtRed,RowL[x].rgbtGreen,RowL[x].rgbtBlue])) div 2;
PixLtns[2]:=(MinIntValue([RowL[x+1].rgbtRed,RowL[x+1].rgbtGreen,RowL[x+1].rgbtBlue])+
MaxIntValue([RowL[x+1].rgbtRed,RowL[x+1].rgbtGreen,RowL[x+1].rgbtBlue])) div 2;
PixLtns[3]:=(MinIntValue([RowM[x-1].rgbtRed,RowM[x-1].rgbtGreen,RowM[x-1].rgbtBlue])+
MaxIntValue([RowM[x-1].rgbtRed,RowM[x-1].rgbtGreen,RowM[x-1].rgbtBlue])) div 2;
PixLtns[4]:=(MinIntValue([RowM[x+1].rgbtRed,RowM[x+1].rgbtGreen,RowM[x+1].rgbtBlue])+
MaxIntValue([RowM[x+1].rgbtRed,RowM[x+1].rgbtGreen,RowM[x+1].rgbtBlue])) div 2;
PixLtns[5]:=(MinIntValue([RowH[x-1].rgbtRed,RowH[x-1].rgbtGreen,RowH[x-1].rgbtBlue])+
MaxIntValue([RowH[x-1].rgbtRed,RowH[x-1].rgbtGreen,RowH[x-1].rgbtBlue])) div 2;
PixLtns[6]:=(MinIntValue([RowH[x].rgbtRed,RowH[x].rgbtGreen,RowH[x].rgbtBlue
])+
MaxIntValue([RowH[x].rgbtRed,RowH[x].rgbtGreen,RowH[x].rgbtBlue])) div 2;
PixLtns[7]:=(MinIntValue([RowH[x+1].rgbtRed,RowH[x+1].rgbtGreen,RowH[x+1].rgbtBlue])+
MaxIntValue([RowH[x+1].rgbtRed,RowH[x+1].rgbtGreen,RowH[x+1].rgbtBlue])) 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].rgbtRed;
g1:=RowL[x-1].rgbtGreen;
b1:=RowL[x-1].rgbtBlue;
end;
if PixIndx[3]=1 then
begin
r1:=RowL[x].rgbtRed;
g1:=RowL[x].rgbtGreen;
b1:=RowL[x].rgbtBlue;
end;
if PixIndx[3]=2 then
begin
r1:=RowL[x+1].rgbtRed;
g1:=RowL[x+1].rgbtGreen;
b1:=RowL[x+1].rgbtBlue;
end;
if PixIndx[3]=3 then
begin
r1:=RowM[x-1].rgbtRed;
g1:=RowM[x-1].rgbtGreen;
b1:=RowM[x-1].rgbtBlue;
end;
if PixIndx[3]=4 then
begin
r1:=RowM[x+1].rgbtRed;
g1:=RowM[x+1].rgbtGreen;
b1:=RowM[x+1].rgbtBlue;
end;
if PixIndx[3]=5 then
begin
r1:=RowH[x-1].rgbtRed;
g1:=RowH[x-1].rgbtGreen;
b1:=RowH[x-1].rgbtBlue;
end;
if PixIndx[3]=6 then
begin
r1:=RowH[x].rgbtRed;
g1:=RowH[x].rgbtGreen;
b1:=RowH[x].rgbtBlue;
end;
if PixIndx[3]=7 then
begin
r1:=RowH[x+1].rgbtRed;
g1:=RowH[x+1].rgbtGreen;
b1:=RowH[x+1].rgbtBlue;
end;
if PixIndx[4]=0 then
begin
r2:=RowL[x-1].rgbtRed;
g2:=RowL[x-1].rgbtGreen;
b2:=RowL[x-1].rgbtBlue;
end;
if PixIndx[4]=1 then
begin
r2:=RowL[x].rgbtRed;
g2:=RowL[x].rgbtGreen;
b2:=RowL[x].rgbtBlue;
end;
if PixIndx[4]=2 then
begin
r2:=RowL[x+1].rgbtRed;
g2:=RowL[x+1].rgbtGreen;
b2:=RowL[x+1].rgbtBlue;
end;
if PixIndx[4]=3 then
begin
r2:=RowM[x-1].rgbtRed;
g2:=RowM[x-1].rgbtGreen;
b2:=RowM[x-1].rgbtBlue;
end;
if PixIndx[4]=4 then
begin
r2:=RowM[x+1].rgbtRed;
g2:=RowM[x+1].rgbtGreen;
b2:=RowM[x+1].rgbtBlue;
end;
if PixIndx[4]=5 then
begin
r2:=RowH[x-1].rgbtRed;
g2:=RowH[x-1].rgbtGreen;
b2:=RowH[x-1].rgbtBlue;
end;
if PixIndx[4]=6 then
begin
r2:=RowH[x].rgbtRed;
g2:=RowH[x].rgbtGreen;
b2:=RowH[x].rgbtBlue;
end;
if PixIndx[4]=7 then
begin
r2:=RowH[x+1].rgbtRed;
g2:=RowH[x+1].rgbtGreen;
b2:=RowH[x+1].rgbtBlue;
end;
// gives a good but grayscale image
RowM[x].rgbtRed:=(PixLtns[3]+PixLtns[4]) div 2;
RowM[x].rgbtGreen:=(PixLtns[3]+PixLtns[4]) div 2;
RowM[x].rgbtBlue:=(PixLtns[3]+PixLtns[4]) div 2;
end;
end;
end;
noveek вне форума Ответить с цитированием
Старый 14.12.2021, 08:19   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

ух ... сколько кода ... так с ходу и не понять что тут к чему.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 14.12.2021, 10:00   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код без отступов - боль. Смущает "buffer2:=j;", по-моему, нужно PixIndx сохранять. Портянка if висит мёртвым грузом, т.к. цвета берутся из PixLtns. А соотношение обработанной картинки к полной намекает, что картинка 32битная, а не 24битная.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.12.2021, 19:04   #4
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код без отступов - боль. Смущает "buffer2:=j;", по-моему, нужно PixIndx сохранять. Портянка if висит мёртвым грузом, т.к. цвета берутся из PixLtns. А соотношение обработанной картинки к полной намекает, что картинка 32битная, а не 24битная.
Почему то в buffer2:=Pixindex[j+k]; ровно тоже самое
noveek вне форума Ответить с цитированием
Старый 14.12.2021, 20:26   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от noveek Посмотреть сообщение
ровно тоже самое
Так это не для исправления недообработки 25%. Вы сейчас фактически не используете PixIndx для выбора цвета пикселя, поэтому его неверная сортировка не будет заметна. Я бы еще избавился от "j+k":
Код:
for j := 0 to 6 do
    for k := j + 1 to 7 do
        if PixLtns[k] <= PixLtns[j] then
        begin
            buffer := PixLtns[j];
            PixLtns[j] := PixLtns[k];
            PixLtns[k] := buffer;
            buffer2 := PixIndx[j];
            PixIndx[j] := PixIndx[k];
            PixIndx[k] := buffer2;
        end;
А для дообработки:
Код:
TRGBArray = array[0..32767] of TRGBQuad;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.12.2021, 20:31   #6
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Так это не для исправления недообработки 25%. Вы сейчас фактически не используете PixIndx для выбора цвета пикселя, поэтому его неверная сортировка не будет заметна. Я бы еще избавился от "j+k":
Код:
for j := 0 to 6 do
    for k := j + 1 to 7 do
        if PixLtns[k] <= PixLtns[j] then
        begin
            buffer := PixLtns[j];
            PixLtns[j] := PixLtns[k];
            PixLtns[k] := buffer;
            buffer2 := PixIndx[j];
            PixIndx[j] := PixIndx[k];
            PixIndx[k] := buffer2;
        end;
А для дообработки:
Код:
TRGBArray = array[0..32767] of TRGBQuad;
Спасибо, но если бы ты процедуру целиком переписал и выложил вообще супер было там может быть что то действительно лишнее и не оптимизированное а ещё лучше даже на ассебмлере
noveek вне форума Ответить с цитированием
Старый 14.12.2021, 20:36   #7
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

noveek, вы должны доработать и выложить финальную процедуру на форум )
Alar вне форума Ответить с цитированием
Старый 14.12.2021, 20:41   #8
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Ну пока вот что вышло, не понял я какие 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;
noveek вне форума Ответить с цитированием
Старый 14.12.2021, 20:51   #9
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Ааа всё до конца вроде процедура GrayScale была лишней по переводу в серый эта процедура похоже автоматом в серый переводит щас всё чётко
noveek вне форума Ответить с цитированием
Старый 14.12.2021, 21:15   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от noveek Посмотреть сообщение
а ещё лучше даже на ассебмлере
Покритиковать код и дать советы могу, но писать готовое не интересно.
Цитата:
Сообщение от noveek Посмотреть сообщение
эта процедура похоже автоматом в серый переводит
Кому-то было лень прочесть комментарии в коде
Можно не на каждой итерации цикла по y вызывать три ScanLine, а вызвать два раза до циклов обработки, а потом верно переписывать значения переменных и один раз вызывать ScanLine. На мой взгляд, довольно странный способ вычисления яркости пикселя - не сталкивался с таким. Сейчас половина кода просто лишняя - определитесь, хотите ли использовать PixIndx или нет. Если нет, то нужно удалить его сортировку и кучу if, где заполняются r1, r2, g1, g2, b1, b2 на его основе. И последняя проблема - плохая идея, писать результат фильтрации в то же изображение, откуда берутся пиксели.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск конца БД Vladimir_Der Microsoft Office Excel 3 03.06.2019 10:34
Не до конца доходит dt,dd,dl AnweeKey HTML и CSS 4 19.09.2018 22:35
накласть медианный фильтр Anriuser JavaScript, Ajax 1 05.03.2017 22:21
Qt - OpenCV - Медианный фильтр fredz Qt и кроссплатформенное программирование С/С++ 0 13.12.2014 13:47
Медианный фильтр Каскадер Помощь студентам 3 26.01.2014 15:10