Доброго дня! Дали задание сделать матричную фильтрацию по красному каналу изображения. Беру соответственно каждый пиксель исходного выдераю красный канал из его окружающих. Значение красного каждого умножаю на матрицу весов, при этом каждое произведение на матричный элемент делится на сумму всех элементов матрицы весов (автоделение), все это складывается и в пиксель уже другого Image ложу цвет с новым красным (R,g,b). Он мне осуществляет как будто небольшое затемнение, ну вот оно не значительно, пробую делать побольше, подругому всяко матрицу весов, деля на сумму элементов матрицы, изображение не меняется...Хотел в связи с этим узнать:
1. Матрица весов может быть какой угодно?
2. Правильно ли все делаю?
3. Как сделать эффект сильнее?
Но при этом задание у меня фильтровать только по красному.
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
94
95
96
97
98
99
100
101
102
103
104
| //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int i=0,j=0,r,g,b,k,l; float **A=new float*[3]; COLORREF pixel_color; float R=0;;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int a; int b;
//вызов окна диалога ОТКРЫТИЕ ГРАФИЧЕСКОГО ФАЙЛА
OpenPictureDialog1->Execute();
if (OpenPictureDialog1->FileName != "") //если в окне диалога есть файл
{
//загрузка файла в поле Image1 с диска
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
/*if ((Image1->Picture->Width>Image1->Width)||(Image1->Picture->Height>Image1->Height))
{
Image1->Stretch=true;
}
else
Image1->Stretch=false;*/
//ширину Image1 сравнять с шириной загружаемого изображения
Image1->Width = Image1->Picture->Width;
//высоту Image1 сравнять с высотой загружаемого изображения
Image1->Height = Image1->Picture->Height;
Panel2->Width = Image1->Picture->Width;
Panel2->Height = Image1->Picture->Height;
Image2->Width = Image1->Picture->Width;
Image2->Height = Image1->Picture->Height;
Panel3->Width = Image1->Picture->Width;
Panel3->Height = Image1->Picture->Height;
Edit1->Text=IntToStr(Image2->Width);
Edit2->Text=IntToStr(Image2->Height);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ for(i=0;i<=Image1->Picture->Width;i++)
for(j=0;j<=Image1->Picture->Height;j++)
{pixel_color = GetPixel(Image1->Picture->Bitmap->Canvas->Handle,i,j);
r= GetRValue(pixel_color);
g= GetGValue(pixel_color);
b= GetBValue(pixel_color);
/*Edit3->Text=IntToStr(r);
Edit4->Text=IntToStr(g);
Edit5->Text=IntToStr(b);*/
Image2->Canvas->Pixels[i][j]= RGB(r,g,b);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(i=0;i<3;i++)
A[i]= new float[3];
A[0][0]=0.5;
A[0][1]=0.75;
A[0][2]=0.5;
A[1][0]=0,75;
A[1][1]=1;
A[1][2]=0.75;
A[2][0]=0.5;
A[2][1]=0.75;
A[2][2]=0.5;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
for(i=1;i<Image1->Picture->Width;i++){
for(j=1;j<Image1->Picture->Height;j++){
pixel_color = GetPixel(Image1->Picture->Bitmap->Canvas->Handle,i,j);
g= GetGValue(pixel_color);
b= GetBValue(pixel_color);
for(l=-1;l<=1;l++){
for(k=-1;k<=1;k++){
pixel_color = GetPixel(Image1->Picture->Bitmap->Canvas->Handle,i+l,j+k);
r= GetRValue(pixel_color);
R=R+(r*A[l+1][k+1])/6;
}
}
Image2->Canvas->Pixels[i][j]= RGB(R,g,b);
R=0;
}
}
}
//--------------------------------------------------------------------------- |
|
Вернуться к обсуждению:
Матричная фильтрация изображения C++ Builder C++ Builder