📄 windipdoc.cpp
字号:
RobertMaskOperation( x, y, m_InputImg, iSize, robMask1, &pixel1 );
RobertMaskOperation( x, y, m_InputImg, iSize, robMask2, &pixel2 );
address = BmpAddress( x, y, iSize );
*( m_OutputImg + address ) = (BYTE)((pixel1.b + pixel2.b) * scale);
*( m_OutputImg + address + 1 ) = (BYTE)((pixel1.g + pixel2.g) * scale);
*( m_OutputImg + address + 2 ) = (BYTE)((pixel1.r + pixel2.r) * scale);
}
}
UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}
void CWinDIPDoc::RobertMasking(int robMask[][2], int mask)
{
if( mask == 1 ){
robMask[0][0] = -1, robMask[0][1] = 0,
robMask[1][0] = 0, robMask[1][1] = 1;
}
else{
robMask[0][0] = 0, robMask[0][1] = -1,
robMask[1][0] = 1, robMask[1][1] = 0;
}
}
void CWinDIPDoc::RobertMaskOperation(int x, int y, BYTE *input, CSize iSize, int robMask[][2], IntRGB *pixel)
{
int wx, wy, address, bgrSum[3] = {0, 0, 0};
int b, g, r, maskX = 0, maskY = 0;
for( wy = 0; wy <= 1; wy++ )
{
maskX = 0;
for( wx = 0; wx <= 1; wx++ )
{
address = BmpAddress( x+wx, y+wy, iSize );
b = *( input + address );
g = *( input + address + 1 );
r = *( input + address + 2 );
bgrSum[0] += robMask[maskX][maskY] * b;
bgrSum[1] += robMask[maskX][maskY] * g;
bgrSum[2] += robMask[maskX][maskY] * r;
maskX++;
}
maskY++;
}
pixel->b = abs(bgrSum[0]);
pixel->g = abs(bgrSum[1]);
pixel->r = abs(bgrSum[2]);
}
void CWinDIPDoc::C3_7_3Sobel()
{
CSize iSize;
iSize.cx = width;
iSize.cy = height;
int x, y, address;
IntRGB pixel1 = {0, 0, 0}, pixel2 = {0, 0, 0};
int sobelMask1[3][3], sobelMask2[3][3];
SobelMasking( sobelMask1, 1 );
SobelMasking( sobelMask2, 2 );
for( y = 1; y < iSize.cy - 1; y++ ){
for( x = 1; x < iSize.cx - 1; x++ ){
SobelMaskOperation( x, y, m_InputImg, iSize, sobelMask1, &pixel1 );
SobelMaskOperation( x, y, m_InputImg, iSize, sobelMask2, &pixel2 );
address = BmpAddress( x, y, iSize );
*( m_OutputImg + address ) = (BYTE)((pixel1.b + pixel2.b) );
*( m_OutputImg + address + 1 ) = (BYTE)((pixel1.g + pixel2.g) );
*( m_OutputImg + address + 2 ) = (BYTE)((pixel1.r + pixel2.r) );
}
}
UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}
void CWinDIPDoc::SobelMasking(int sobelMask[][3], int mask)
{
}
void CWinDIPDoc::SobelMaskOperation(int x, int y, BYTE *input, CSize iSize, int sobelMask[][3], IntRGB *pixel)
{
int wx, wy, address, bgrSum[3] = {0, 0, 0};
int b, g, r, maskX = 0, maskY = 0;
}
void CWinDIPDoc::C2_MOUSE(CPoint m_pt1, CPoint m_pt2)
{
int x, y, b, g, r;
int address;
CSize iSize;
iSize.cx = width;
iSize.cy = height;
for( y = m_pt1.y; y < m_pt2.y; y++ )
{
for( x = m_pt1.x; x < m_pt2.x; x++ )
{
address = BmpAddress( x, y, iSize );
b = *( m_InputImg + address );
g = *( m_InputImg + address + 1 );
r = *( m_InputImg + address + 2 );
*( m_OutputImg + address ) = b;
*( m_OutputImg + address + 1 ) = g;
*( m_OutputImg + address + 2 ) = r;
}
}
UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}
void CWinDIPDoc::Labeling()
{
int x, y, num, left, top, k;
//int *rt;
//int *area;
int address, b, g, r, intensity, i;
int j = 0;
CSize iSize;
iSize.cx = width;
iSize.cy = height;
// BYTE pixelColor[2][2][3];
int **Label;
// rt = (new int)[width * height];
// area = (new int)[width * height];
for(y = 0; y < iSize.cy; y++) //硅版 备埃 : -1, 拱眉 : 0栏肺 檬扁拳 threshold
{
for(x = 0; x <iSize.cx; x++)
{
address = BmpAddress( x, y, iSize );
b = *( m_InputImg + address );
g = *( m_InputImg + address + 1 );
r = *( m_InputImg + address + 2 );
intensity = (int)(b + g + r) / 3;
if(intensity >= 128)
Label[y][x] = 0;
else Label[y][x] = -1;
}
}
for(x = 0; x < width; x++) //康惑狼 版拌急 拱眉 康开 力芭
{
Label[0][x] = -1;
Label[height-1][x] = -1;
}
for(y = 0; y < height; y++) //饭骇 康惑 檬扁拳
{
Label[y][0] = -1;
Label[y][width-1] = -1;
}
num = -1;
for(y = 0; y < height; y++) {
for(x = 0; x < width; x++) {
if(y > 0 && x > 0) {
if(Label[y][x] >= 0) {
left = Label[y][x-1];
top = Label[y-1][x];
if(left == -1 && top != -1) {
Label[y][x] = top;
}
else if(left != -1 && top == -1) {
Label[y][x] = left;
}
else if(left == -1 && top == -1) {
num++;
Label[y][x] = num;
}
else if(left != -1 && top != -1){
if(left == top) {
Label[y][x] = left;
}
else if(left > top) {
Label[y][x] = top;
left= top;
}
else {
Label[y][x] = left;
top = left;
}
}
}
}
}
}
/*
for(k = 0; k <= num; k++) {
if(k != rt[k]) rt[k] = rt[rt[k]];
area[k] = 0;
}
for(y = 0; y < height; y++)
for(x = 0; x < width; x++) {
if(Label[y][x] > -1) {
Label[y][x] = rt[Label[y][x]];
area[Label[y][x]]++;
}
}
int cnt = 0;
for (k = 0; k <= num; k++) {
if(area[k] > 4) rt[k] = cnt++;
else rt[k] = -1;
}
for(y = 0; y < height; y++)
for(x = 0; x < width; x++) {
if(Label[y][x] >= 0)
Label[y][x] = rt[Label[y][x]];
}
delete [] r;
delete [] area;
*/
for( y = 0; y < height; y++ )
{
for( x = 0; x < width; x++ )
{
address = BmpAddress( x, y, iSize );
//b = *( m_InputImg + address );
//g = *( m_InputImg + address + 1 );
//r = *( m_InputImg + address + 2 );
if(Label[y][x] >= 0)
{
if(Label[y][x] == j)
{
*( m_OutputImg + address ) = j * 10 + 10;
*( m_OutputImg + address + 1 ) = j * 10 + 10;
*( m_OutputImg + address + 2 ) = j * 10 + 10;
j++;
}
else
j++;
}
else
{
*( m_OutputImg + address ) = 0;
*( m_OutputImg + address + 1 ) = 0;
*( m_OutputImg + address + 2 ) = 0;
}
}
}
UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}
void CWinDIPDoc::C3_7_2Highboost(double mask)
{
CSize iSize;
iSize.cx = width;
iSize.cy = height;
double HighMask[3][3];
HighboostMasking( HighMask, mask );
HighboostFilteringOperation( m_InputImg, m_OutputImg, HighMask, mask, iSize );
UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}
void CWinDIPDoc::HighboostMasking(double HighMask[][3], double mask)
{
int x, y;
for( y = 0; y < 3; y++ )
{
for( x = 0; x < 3; x++ )
{
if(x == 1 && y == 1)
HighMask[x][y] = mask + 8;
else
HighMask[x][y] = -1;
}
}
}
void CWinDIPDoc::HighboostFilteringOperation(BYTE *input, BYTE *output, double HighMask[][3], double mask, CSize iSize)
{
int x, y, wHalfSize, address;
ColorRGB pixel;
for( y = 1; y < iSize.cy - 1; y++ )
{
for( x = 1; x < iSize.cx - 1; x++ )
{
HighboostMaskOperation(x, y, input, iSize, HighMask, mask, &pixel);
address = BmpAddress( x, y , iSize );
*( output + address ) = pixel.b;
*( output + address + 1 ) = pixel.g;
*( output + address + 2 ) = pixel.r;
}
}
}
void CWinDIPDoc::HighboostMaskOperation(int x, int y, BYTE *input, CSize iSize, double HighMask[][3], double mask, ColorRGB *pixel)
{
int wx, wy, address;
double bgrSum[3] = {0, 0, 0};
int b, g, r, maskX = 0, maskY = 0, wHalfSize;
int scale = 3;
wHalfSize = 1;
for( wy = -wHalfSize; wy <= wHalfSize; wy++ ) //付农救俊 -1何磐 1鳖瘤 付胶农狼 农扁父怒
{
maskX = 0;
for( wx = -wHalfSize; wx <= wHalfSize; wx++ )
{
address = BmpAddress( x+wx, y+wy, iSize );
b = *( input + address );
g = *( input + address + 1 );
r = *( input + address + 2 );
bgrSum[0] += HighMask[maskX][maskY] * b;
bgrSum[1] += HighMask[maskX][maskY] * g;
bgrSum[2] += HighMask[maskX][maskY] * r;
maskX++;
}
maskY++;
}
if(bgrSum[0] > 255)
bgrSum[0] = 255;
if(bgrSum[1] > 255)
bgrSum[1] = 255;
if(bgrSum[2] > 255)
bgrSum[2] = 255;
if(bgrSum[0] < 0)
bgrSum[0] = 0;
if(bgrSum[1] < 0)
bgrSum[1] = 0;
if(bgrSum[2] < 0)
bgrSum[2] = 0;
pixel->b = bgrSum[0];
pixel->g = bgrSum[1];
pixel->r = bgrSum[2];
}
void CWinDIPDoc::C3_3_4HistogramStatistics()
{
CSize iSize;
iSize.cx = width;
iSize.cy = height;
int HistoMask[3][3];
HistogramOperating(m_InputImg, m_OutputImg, HistoMask, iSize);
UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}
//DEL void CWinDIPDoc::HistogramFrequencyCounting(m_InputImg, numPixel, iSize)
//DEL {
//DEL int wx, wy, b, g, r, gray;
//DEL int address;
//DEL
//DEL for( gray = 0; gray < 256; gray++ )
//DEL {
//DEL numPixel[gray].b = 0;
//DEL numPixel[gray].g = 0;
//DEL numPixel[gray].r = 0;
//DEL }
//DEL
//DEL for( wy = x -1; y < iSize.cy; y++ )
//DEL {
//DEL for( wx = 0; x < iSize.cx; x++ )
//DEL {
//DEL address = BmpAddress( x, y, iSize );
//DEL
//DEL b = *( input + address );
//DEL g = *( input + address + 1 );
//DEL r = *( input + address + 2 );
//DEL
//DEL numPixel[b].b += 1;
//DEL numPixel[g].g += 1;
//DEL numPixel[r].r += 1;
//DEL }
//DEL }
//DEL }
void CWinDIPDoc::HistogramOperating(BYTE *input, BYTE *output, int HistoMask[][3], CSize iSize)
{
int x, y, address, b, g, r;
int Lmean, Lvariance, Gmean, Gvariance;
double k0, k1, k2, E;
E = 4.0;
k0 = 0.4;
k1 = 0.02;
k2 = 0.4;
for( y = 1; y < iSize.cy - 1; y++ )
{
for( x = 1; x < iSize.cx - 1; x++ )
{
Lmean = LocalMeanOperation(x, y, input, HistoMask, iSize);
Lvariance = LocalVarianceOperation(x, y, input, HistoMask, iSize);
Gmean = GlobalMeanOperation(x, y, input, HistoMask, iSize);
Gvariance = GlobalVarianceOperation(x, y, input, HistoMask, iSize);
//HistogramFrequencyCounting(x, y, input, HistoMask, iSize, &pixel);
if((Lmean <= (k0 * Gmean)) && ((k1 * Gvariance) <= Lvariance) && ((k2 * Gvariance) >= Lvariance))
{
address = BmpAddress( x, y , iSize );
b = *( input + address );
g = *( input + address + 1 );
r = *( input + address + 2 );
*( output + address ) = b * E;
*( output + address + 1 ) = g * E;
*( output + address + 2 ) = r * E;
}
else
{
address = BmpAddress( x, y , iSize );
b = *( input + address );
g = *( input + address + 1 );
r = *( input + address + 2 );
*( output + address ) = b;
*( output + address + 1 ) = g;
*( output + address + 2 ) = r;
}
}
}
}
int CWinDIPDoc::LocalMeanOperation(int x, int y, BYTE *input, int HistoMask[][3], CSize iSize)
{
int wx, wy, b, g, r, count = 0;
int address;
for(wy = y-1; wy <= y+1; wy++)
{
for(wx = x-1; wx <= x+1; wx++)
{
address = BmpAddress( wx, wy, iSize );
b = *( input + address );
g = *( input + address + 1 );
r = *( input + address + 2 );
count += b;
}
}
return (count/9);
}
int CWinDIPDoc::LocalVarianceOperation(int x, int y, BYTE *input, int HistoMask[][3], CSize iSize)
{
int wx, wy, b, g, r, count = 0, count1 = 0, variance;
int address;
for(wy = y-1; wy <= y+1; wy++)
{
for(wx = x-1; wx <= x+1; wx++)
{
address = BmpAddress( wx, wy, iSize );
b = *( input + address );
g = *( input + address + 1 );
r = *( input + address + 2 );
count1 += b * b;
count += b;
}
}
variance = (count1 / 9) - ((count / 9) * (count / 9));
return variance;
}
int CWinDIPDoc::GlobalMeanOperation(int x, int y, BYTE *input, int HistoMask[][3], CSize iSize)
{
int wx, wy, b, g, r, count = 0;
int address;
int total;
total = iSize.cy * iSize.cy;
for(wy = 0; wy < iSize.cy; wy++)
{
for(wx = 0; wx < iSize.cx; wx++)
{
address = BmpAddress( wx, wy, iSize );
b = *( input + address );
g = *( input + address + 1 );
r = *( input + address + 2 );
count += b;
}
}
return (count/total);
}
int CWinDIPDoc::GlobalVarianceOperation(int x, int y, BYTE *input, int HistoMask[][3], CSize iSize)
{
int wx, wy, b, g, r, count = 0, count1 = 0, variance;
int address;
int total;
total = iSize.cy * iSize.cy;
for(wy = 0; wy < iSize.cy; wy++)
{
for(wx = 0; wx < iSize.cx; wx++)
{
address = BmpAddress( wx, wy, iSize );
b = *( input + address );
g = *( input + address + 1 );
r = *( input + address + 2 );
count1 += b * b;
count += b;
}
}
variance = (count1 / total) - ((count / total) * (count / total));
return variance;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -