关于图象的自动色调整的问题
现在打算做个处理图片的小软件,其中有个自动调整图象的功能,这个功能要求能够根据图象的当前画质进行调整.比方说一个图象如果是数码相机里照出来的,看起来不太清楚的话就能自动锐化,如果对比度或者亮度不够也会进行相应的调整,如果图象本身效果很好就不需要处理,请问这个功能该如何下手??大家帮帮忙啊,急!!我在线等.
[解决办法]
这个功能似乎比较复杂吧
“看起来不太清楚” 怎么定义?
“对比度或者亮度不够” 怎么判断?
“图象本身效果很好” 怎么判断?
先搞清楚这些吧,基本是图像处理的范畴的。
[解决办法]
建议lz先去补充离散函数,复变函数和计算机图形学的基础课程。
这绝对不是一个“小软件”,光其中的数学变换就够写一阵子的了
[解决办法]
1.要不把自动处理的功能变成手动处理的功能?
2.要不我想每个处理都有一个处理的参数,比如说是锐化(参数ruihuaPara),然后先预对该图象处理一下形成一个newImage,处理后对其每个象素点的颜色与oldImage进行比较,比较颜色的近似程度(当然也要一个近似比较程度的参数reihuaNearPara),分别计数大于的和小于近似程度的,大的/总数 > ruihuaPara ? 进行锐化处理 :不进行锐化处理。
[解决办法]
柔滑和锐化处理的代码如下
private void BlurAndSharpen_Click(object sender, System.EventArgs e) { Graphics graphics = this.CreateGraphics(); graphics.Clear(Color.White); graphics.ScaleTransform(0.8f, 0.8f); Bitmap image = new Bitmap("snike.bmp"); int Width = image.Width; int Height = image.Height; //image2:进行锐化处理 Bitmap image2 = (Bitmap)image.Clone(); Color colorTemp; Color[,] color = new Color[3, 3]; //绘制原图 graphics.DrawImage( image, new Rectangle(0, 0, Width, Height)); for (int i = 1; i < Width - 2; i++) { for (int j = 1; j < Height - 2; j++) { //访问周围9个点的RGB值 color[0, 0] = image.GetPixel(i - 1, j - 1); color[0, 1] = image.GetPixel(i - 1, j); color[0, 2] = image.GetPixel(i - 1, j + 1); color[1, 0] = image.GetPixel(i, j - 1); color[1, 1] = image.GetPixel(i, j); color[1, 2] = image.GetPixel(i, j + 1); color[2, 0] = image.GetPixel(i + 1, j - 1); color[2, 1] = image.GetPixel(i + 1, j); color[2, 2] = image.GetPixel(i + 1, j + 1); int rSum = 0; int gSum = 0; int bSum = 0; //分别求出周围9个点的R、G、B之和 for (int n = 0; n < 3; n++) for (int nn = 0; nn < 3; nn++) { rSum += color[n, nn].R; gSum += color[n, nn].G; bSum += color[n, nn].B; } //用RGB的平均值做为当前点的RGB值 colorTemp = Color.FromArgb(255, (int)(rSum / 9), (int)(gSum / 9), (int)(bSum / 9)); //将计算后的RGB值回写到位图 image.SetPixel(i, j, colorTemp); } //绘制经过平滑处理的效果图 graphics.DrawImage( image, new Rectangle(Width, 0, Width, Height)); } //进行锐化处理 Color colorLeft, colornow; //常量dep:锐化系数,此值越大,锐化效果越明显 float dep = 0.550f; for (int i = 1; i < Width - 1; i++) { for (int j = 1; j < Height - 1; j++) { colornow = image2.GetPixel(i, j); colorLeft = image2.GetPixel(i - 1, j - 1); float r = colornow.R + (colornow.R - colorLeft.R * dep); r = Math.Min(255, Math.Max(0, r)); float g = colornow.G + (colornow.G - colorLeft.G * dep); g = Math.Min(255, Math.Max(0, g)); float b = colornow.B + (colornow.B - colorLeft.B * dep); b = Math.Min(255, Math.Max(0, b)); colorTemp = Color.FromArgb(255, (int)r, (int)g, (int)b); //将计算后的RGB值回写到位图 image2.SetPixel(i, j, colorTemp); } graphics.DrawImage( image2, new Rectangle(Width * 2, 0, Width, Height)); } }
[解决办法]
可以看有关边缘检测方面的资料,具体怎么做我也说不清楚,你的想法很好
一个自动就难了,