Kod z formy1 - unit1.cpp:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit8.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
{
Image->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn7Click(TObject *Sender)
{
Form8->BMP->Assign( Image->Picture->Graphic );
Form8->BMP->PixelFormat = pf32bit;
Form8->Image1->Picture->Assign( Form8->BMP );
Form8->Image2->Picture->Assign( Form8->BMP );
Form8->ShowModal();
}
//---------------------------------------------------------------------------
Kod z form8 - unit8.cpp:
#include <vcl.h>
#pragma hdrstop
#include "Unit8.h"
#include "Filters.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm8 *Form8;
int *Filter;
unsigned char **red, **green, **blue, **gray;
int Norm;
int Size;
//---------------------------------------------------------------------------
__fastcall TForm8::TForm8(TComponent* Owner)
: TForm(Owner)
{
BMP = new Graphics::TBitmap();
}
//---------------------------------------------------------------------------
void __fastcall TForm8::LinearFiltr(TObject *Sender)
{
int rsume, gsume, bsume, graysume;
int margin = ((Size-1)/2);
//filtr dla obrazu kolorowego
for (int i=margin; i<Image1->Width-margin; i++)
for (int j=margin; j<Image1->Height-margin; j++)
{
rsume = 0;
gsume = 0;
bsume = 0;
for (int k=0; k<Size; k++)
for (int l=0; l<Size; l++)
{
rsume += Filter[k*Size+l]*red[i+k-margin][j+l-margin];
gsume += Filter[k*Size+l]*green[i+k-margin][j+l-margin];
bsume += Filter[k*Size+l]*blue[i+k-margin][j+l-margin];
}
rsume /= Norm;
gsume /= Norm;
bsume /= Norm;
if (rsume > 255) rsume = 255;
else if (rsume < 0) rsume = 0;
if (gsume > 255) gsume = 255;
else if (gsume < 0) gsume = 0;
if (bsume > 255) bsume = 255;
else if (bsume < 0) bsume = 0;
Image2->Canvas->Pixels[i][j] = (TColor)rsume + (gsume << 8) + (bsume << 16);
}
}
void __fastcall TForm8::MinFiltr(TObject *Sender)
{
int rmin, gmin, bmin, graymin;
Size = 3;
int margin = ((Size-1)/2);
//filtr dla obrazu kolorowego
for (int i=margin; i<Image1->Width-margin; i++)
for (int j=margin; j<Image1->Height-margin; j++)
{
rmin = 255;
gmin = 255;
bmin = 255;
for (int k=0; k<Size; k++)
for (int l=0; l<Size; l++)
{
if (rmin > red[i+k-margin][j+l-margin]) rmin = red[i+k-margin][j+l-margin];
if (gmin > green[i+k-margin][j+l-margin]) gmin = green[i+k-margin][j+l-margin];
if (bmin > blue[i+k-margin][j+l-margin]) bmin = blue[i+k-margin][j+l-margin];
}
Image2->Canvas->Pixels[i][j] = (TColor)rmin + (gmin << 8) + (bmin << 16);
}
}
void __fastcall TForm8::MaxFiltr(TObject *Sender)
{
int rmax, gmax, bmax, graymax;
Size = 3;
int margin = ((Size-1)/2);
//filtr dla obrazu kolorowego
for (int i=margin; i<Image1->Width-margin; i++)
for (int j=margin; j<Image1->Height-margin; j++)
{
rmax = 0;
gmax = 0;
bmax = 0;
for (int k=0; k<Size; k++)
for (int l=0; l<Size; l++)
{
if (rmax < red[i+k-margin][j+l-margin]) rmax = red[i+k-margin][j+l-margin];
if (gmax < green[i+k-margin][j+l-margin]) gmax = green[i+k-margin][j+l-margin];
if (bmax < blue[i+k-margin][j+l-margin]) bmax = blue[i+k-margin][j+l-margin];
}
Image2->Canvas->Pixels[i][j] = (TColor)rmax + (gmax << 8) + (bmax << 16);
}
}
//dla algorytmu Hoar'e - obliczanie mediany
int partition(int *c, int a, int b)
{
int e,tmp;
a=a;
b=b;
e=c[a]; //elemennt dzielacy
while (a<b)
{
while ((a<b) && (c[b]>=e)) b--;
while ((a<b) && (c[a]<e)) a++;
if (a<b)
{
tmp=c[a];
c[a]=c[b];
c[b]=tmp;
}
}
return a;
}
//algorytmu Hoar'e - obliczanie mediany
int med(int *c, int size)
{
//algorytm Hoare'a
int i = 0;
int j = size - 1;
int w = j / 2;
int k;
while (i!=j)
{
k=partition(c,i,j);
k=k-i+1;
if (k>=w)
j=i+k-1;
if (k<w)
{
w-=k;
i+=k;
}
}
return c[i];
}
void __fastcall TForm8::MedFiltr(TObject *Sender)
{
int rval[9], gval[9], bval[9], grayval[9], m;
Size = 3;
int margin = ((Size-1)/2);
//filtr dla obrazu kolorowego
for (int i=margin; i<Image1->Width-margin; i++)
for (int j=margin; j<Image1->Height-margin; j++)
{
m = 0;
for (int k=0; k<Size; k++)
for (int l=0; l<Size; l++)
{
rval[m] = red[i+k-margin][j+l-margin];
gval[m] = green[i+k-margin][j+l-margin];
bval[m] = blue[i+k-margin][j+l-margin];
m++;
}
Image2->Canvas->Pixels[i][j] = (TColor)med(rval,9) + (med(gval,9) << 8) + (med(bval,9) << 16);
}
}
void __fastcall TForm8::KuwaharaFiltr(TObject *Sender)
{
double rm[4], gm[4], bm[4], graym[4]; //wartosci srednie
double rs[4], gs[4], bs[4], grays[4]; //wariancje
int m, mr, mg, mb;
Size = 5;
int margin = ((Size-1)/2);
//filtr dla obrazu kolorowego
for (int i=margin; i<Image1->Width-margin; i++)
for (int j=margin; j<Image1->Height-margin; j++)
{
//policz srednie
for (int k=0; k<4; k++)
{
rm[k] = 0;
gm[k] = 0;
bm[k] = 0;
}
for (int k=0; k<3; k++)
for (int l=0; l<3; l++)
{
rm[0] += red[i+k-margin][j+l-margin] / 9.0;
rm[1] += red[i+k][j+l-margin] / 9.0;
rm[2] += red[i+k-margin][j+l] / 9.0;
rm[3] += red[i+k][j+l] / 9.0;
gm[0] += green[i+k-margin][j+l-margin] / 9.0;
gm[1] += green[i+k][j+l-margin] / 9.0;
gm[2] += green[i+k-margin][j+l] / 9.0;
gm[3] += green[i+k][j+l] / 9.0;
bm[0] += blue[i+k-margin][j+l-margin] / 9.0;
bm[1] += blue[i+k][j+l-margin] / 9.0;
bm[2] += blue[i+k-margin][j+l] / 9.0;
bm[3] += blue[i+k][j+l] / 9.0;
}
//policz wariancje
for (int k=0; k<4; k++)
{
rs[k] = 0;
gs[k] = 0;
bs[k] = 0;
}
for (int k=0; k<3; k++)
for (int l=0; l<3; l++)
{
rs[0] += (red[i+k-margin][j+l-margin] - rm[0]) * (red[i+k-margin][j+l-margin] - rm[0]);
rs[1] += (red[i+k][j+l-margin] - rm[1]) * (red[i+k][j+l-margin] - rm[1]);
rs[2] += (red[i+k-margin][j+l] - rm[2]) * (red[i+k-margin][j+l] - rm[2]);
rs[3] += (red[i+k][j+l] - rm[3]) * (red[i+k][j+l] - rm[3]);
gs[0] += (green[i+k-margin][j+l-margin] - gm[0]) * (green[i+k-margin][j+l-margin] - gm[0]);
gs[1] += (green[i+k][j+l-margin] - gm[1]) * (green[i+k][j+l-margin] - gm[1]);
gs[2] += (green[i+k-margin][j+l] - gm[2]) * (green[i+k-margin][j+l] - gm[2]);
gs[3] += (green[i+k][j+l] - gm[3]) * (green[i+k][j+l] - gm[3]);
bs[0] += (blue[i+k-margin][j+l-margin] - bm[0]) * (blue[i+k-margin][j+l-margin] - bm[0]);
bs[1] += (blue[i+k][j+l-margin] - bm[1]) * (blue[i+k][j+l-margin] - bm[1]);
bs[2] += (blue[i+k-margin][j+l] - bm[2]) * (blue[i+k-margin][j+l] - bm[2]);
bs[3] += (blue[i+k][j+l] - bm[3]) * (blue[i+k][j+l] - bm[3]);
}
//znajdz najmniejsza wariancje
mr=0;
for (int k=1; k<4; k++)
if (rs[k] < rs[mr])
mr = k;
mg=0;
for (int k=1; k<4; k++)
if (gs[k] < gs[mg])
mg = k;
mb=0;
for (int k=1; k<4; k++)
if (bs[k] < bs[mb])
mb = k;
Image2->Canvas->Pixels[i][j] = (TColor)(int)rm[mr] + ((int)gm[mg] << 8) + ((int)bm[mb] << 16);
}
}
//zaladowanie wybranego filtru
void UpdateFilter(int *NewFilter, int size)
{
Form8->StringGrid1->RowCount = size;
Form8->StringGrid1->ColCount = size;
Filter = NewFilter;
for (int i=0; i<size; i++)
for (int j=0; j<size; j++)
Form8->StringGrid1->Cells[j][i] = IntToStr(Filter[i+size*j]);
Norm = 0;
for (int i=0; i<size; i++)
for (int j=0; j<size; j++)
Norm += Filter[i+size*j];
if (Norm == 0) Norm = 1;
Form8->Label1->Caption = "1/" + IntToStr(Norm) + " *";
Form8->Label1->Visible = TRUE;
Form8->StringGrid1->Visible = TRUE;
Form8->Button1->OnClick = Form8->LinearFiltr;
Size = size;
}
//---------------------------------------------------------------------------
void __fastcall TForm8::FormCreate(TObject *Sender)
{
TColor color;
red = (unsigned char**)malloc(Form8->Image1->Width * sizeof(char*));
green = (unsigned char**)malloc(Form8->Image1->Width * sizeof(char*));
blue = (unsigned char**)malloc(Form8->Image1->Width * sizeof(char*));
for (int i=0; i<Form8->Image1->Width; i++)
{
red[i] = (unsigned char*)malloc(Form8->Image1->Height);
green[i] = (unsigned char*)malloc(Form8->Image1->Height);
blue[i] = (unsigned char*)malloc(Form8->Image1->Height);
for (int j=0; j<Form8->Image1->Height; j++)
{
color = Form8->Image1->Canvas->Pixels[i][j];
red[i][j] = (color & 0xFF);
green[i][j] = ((color >> 8) & 0xFF);
blue[i][j] = ((color >> 16) & 0xFF);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm8::ComboBox1Change(TObject *Sender)
{
switch (ComboBox1->ItemIndex) {
case 0: UpdateFilter(GAUSS1, GAUSS1_SIZE); break;
case 1: UpdateFilter(GAUSS2, GAUSS2_SIZE); break;
case 2: UpdateFilter(GAUSS3, GAUSS3_SIZE); break;
case 3: UpdateFilter(GAUSS4, GAUSS4_SIZE); break;
case 4: UpdateFilter(GAUSS5, GAUSS5_SIZE); break;
}
}
//---------------------------------------------------------------------------
Kod z Unit8.h:
#ifndef Unit8H
#define Unit8H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TForm8 : public TForm
{
__published: // IDE-managed Components
TImage *Image1;
TBitBtn *BitBtn1;
TBitBtn *BitBtn2;
TComboBox *ComboBox1;
TLabel *Label1;
TStringGrid *StringGrid1;
TButton *Button1;
TImage *Image2;
TImage *ObrazMono;
TImage *WynikMono;
void __fastcall FormCreate(TObject *Sender);
void __fastcall ComboBox1Change(TObject *Sender);
void __fastcall LinearFiltr(TObject *Sender);
void __fastcall MaxFiltr(TObject *Sender);
void __fastcall MinFiltr(TObject *Sender);
void __fastcall MedFiltr(TObject *Sender);
void __fastcall KuwaharaFiltr(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm8(TComponent* Owner);
Graphics::TBitmap *BMP;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm8 *Form8;
//---------------------------------------------------------------------------
#endif
Kod z Filters.h:
#ifndef FiltersH
#define FiltersH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm9 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TForm9(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm9 *Form9;
int GAUSS1_SIZE = 3;
int GAUSS1[9] = {1, 2, 1,
2, 4, 2,
1, 2, 1};
int GAUSS2_SIZE = 5;
int GAUSS2[25] = {1, 1, 2, 1, 1,
1, 2, 4, 2, 1,
2, 4, 8, 4, 2,
1, 2, 4, 2, 1,
1, 1, 2, 1, 1};
int GAUSS3_SIZE = 5;
int GAUSS3[25] = {0, 1, 2, 1, 0,
1, 4, 8, 4, 1,
2, 8, 16,8, 2,
1, 4, 8, 4, 1,
0, 1, 2, 1, 0};
int GAUSS4_SIZE = 5;
int GAUSS4[25] = {1, 4, 7, 4, 1,
4,16,26,16, 4,
7,26,41,26, 7,
4,26,16,26, 4,
1, 4, 7, 4, 1};
int GAUSS5_SIZE = 7;
int GAUSS5[49] = {1, 1, 2, 2, 2, 1, 1,
1, 2, 2, 4, 2, 2, 1,
2, 2, 4, 8, 4, 2, 2,
2, 4, 8,16, 8, 4, 2,
2, 2, 4, 8, 4, 2, 2,
1, 2, 2, 4, 2, 2, 1,
1, 1, 2, 2, 2, 1, 1};
//---------------------------------------------------------------------------
#endif
Oprócz tego mam szereg warning'ów lecz program się kompiluje:
[Linker Warning] Public symbol '_GAUSS1_SIZE' defined in both module C:\USERS\P4X3S\DESKTOP\GAUSSA\TEST - KOPIA\UNIT8.OBJ and C:\USERS\P4X3S\DESKTOP\GAUSSA\TEST - KOPIA\FILTERS.OBJ |
Środowisko programowania C++ Bulider 6