用VS2010编程图像处理程序在打开一幅图像时,我设置picturebox1的大小为256*256,打开一幅256*256的彩色图像是能完全打开的。但是我的毕设用的是老师拍摄的3648*2736,大小3M的带孔零件照片。打开只能显示一小部分。我要边缘提取分割全部圆孔,所以要全部显示出来的。老师说不要改动原零件照片,而是在picturebox右边和下面放水平和垂直滚动条,这样显示整幅图片。我是小白,不知道该怎么办了。还有随便问一下,我在采样时打开的彩色图像,在采样后还是彩色的,但是量化时打开的彩色图像为何量化后都是灰度图的了呢,不是说灰度图是RGB各分量相等的“彩色图”吗,难道我的彩色图的RGB分量都是相等的么。下面是我的代码:
//采样
private void menuItem6_Click(object sender, EventArgs e)
{
if (curBitmap != null)
{
this.Text = "第2章 图像数字化";
paramDialog dialog = new paramDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
int d = Convert.ToInt32(dialog.getParam);
Bitmap bm = new Bitmap(pictureBox1.Image);
int dd = d * d;
for (int j = 0; j < ih; j=j+d)
{
for (int i = 0; i < iw; i=i+d)
{
int r = 0, g = 0, b = 0;
for (int k = 0; k < d; k++)
{
for (int l = 0; l < d; l++)
{
r = r + bm.GetPixel(i + k, j + l).R;
}
} for (int k = 0; k < d; k++)
{
for (int l = 0; l < d; l++)
{
g = g + bm.GetPixel(i + k, j + l).G;
}
} for (int k = 0; k < d; k++)
{
for (int l = 0; l < d; l++)
{
b = b + bm.GetPixel(i + k, j + l).B;
}
}
r = (int)(r / dd);
g = (int)(g / dd);
b = (int)(b / dd);
for (int k = 0; k < d; k++)
{
for (int l = 0; l < d; l++)
{
bm.SetPixel(i + k, j + l, Color.FromArgb(r, g, b));
}
} }
}
pictureBox2.Refresh();
pictureBox2.Image = bm;
label2.Text = "采样后";
} }
}
//量化
private void menuItem8_Click(object sender, EventArgs e)
{
if (curBitmap != null)
{
this.Text = "第2章 图像数字化";
paramDialog dialog = new paramDialog();
dialog.label1.Text = "灰度级数";
dialog.groupBox1.Text = "输入灰度级数(2/4/8/16/32/64/128/256)";
if (dialog.ShowDialog() == DialogResult.OK)
{
int level = Convert.ToInt32(dialog.getParam);
int greyLevel = 256 / level;
int r, g, b,temp;
Bitmap bm = new Bitmap(pictureBox1.Image );
for (int j = 0; j < ih; j++)
{
for (int i = 0; i < iw; i++)
{
r = bm.GetPixel(i, j).R;
temp = (int)(r / greyLevel);
r = temp * greyLevel; g = bm.GetPixel(i, j).G;
temp = (int)(r / greyLevel);
g = temp * greyLevel; b = bm.GetPixel(i, j).B;
temp = (int)(r / greyLevel);
b = temp * greyLevel; bm.SetPixel(i, j, Color.FromArgb(r, g, b));
}
}
pictureBox2.Refresh();
pictureBox2.Image = bm;
label2.Text = "量化后";
} }
}
C#采样量化显示大图像
//采样
private void menuItem6_Click(object sender, EventArgs e)
{
if (curBitmap != null)
{
this.Text = "第2章 图像数字化";
paramDialog dialog = new paramDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
int d = Convert.ToInt32(dialog.getParam);
Bitmap bm = new Bitmap(pictureBox1.Image);
int dd = d * d;
for (int j = 0; j < ih; j=j+d)
{
for (int i = 0; i < iw; i=i+d)
{
int r = 0, g = 0, b = 0;
for (int k = 0; k < d; k++)
{
for (int l = 0; l < d; l++)
{
r = r + bm.GetPixel(i + k, j + l).R;
}
} for (int k = 0; k < d; k++)
{
for (int l = 0; l < d; l++)
{
g = g + bm.GetPixel(i + k, j + l).G;
}
} for (int k = 0; k < d; k++)
{
for (int l = 0; l < d; l++)
{
b = b + bm.GetPixel(i + k, j + l).B;
}
}
r = (int)(r / dd);
g = (int)(g / dd);
b = (int)(b / dd);
for (int k = 0; k < d; k++)
{
for (int l = 0; l < d; l++)
{
bm.SetPixel(i + k, j + l, Color.FromArgb(r, g, b));
}
} }
}
pictureBox2.Refresh();
pictureBox2.Image = bm;
label2.Text = "采样后";
} }
}
//量化
private void menuItem8_Click(object sender, EventArgs e)
{
if (curBitmap != null)
{
this.Text = "第2章 图像数字化";
paramDialog dialog = new paramDialog();
dialog.label1.Text = "灰度级数";
dialog.groupBox1.Text = "输入灰度级数(2/4/8/16/32/64/128/256)";
if (dialog.ShowDialog() == DialogResult.OK)
{
int level = Convert.ToInt32(dialog.getParam);
int greyLevel = 256 / level;
int r, g, b,temp;
Bitmap bm = new Bitmap(pictureBox1.Image );
for (int j = 0; j < ih; j++)
{
for (int i = 0; i < iw; i++)
{
r = bm.GetPixel(i, j).R;
temp = (int)(r / greyLevel);
r = temp * greyLevel; g = bm.GetPixel(i, j).G;
temp = (int)(r / greyLevel);
g = temp * greyLevel; b = bm.GetPixel(i, j).B;
temp = (int)(r / greyLevel);
b = temp * greyLevel; bm.SetPixel(i, j, Color.FromArgb(r, g, b));
}
}
pictureBox2.Refresh();
pictureBox2.Image = bm;
label2.Text = "量化后";
} }
}
C#采样量化显示大图像
2.把灰度图装入RGB空间时,才是三个通道相等,事实上,灰度图的文件数据就有一个通道。
如楼上所说jpg 灰度图本来就是单独存储的。