读书人

关于图象的自动色调整的有关问题

发布时间: 2011-12-14 23:20:17 作者: rapoo

关于图象的自动色调整的问题
现在打算做个处理图片的小软件,其中有个自动调整图象的功能,这个功能要求能够根据图象的当前画质进行调整.比方说一个图象如果是数码相机里照出来的,看起来不太清楚的话就能自动锐化,如果对比度或者亮度不够也会进行相应的调整,如果图象本身效果很好就不需要处理,请问这个功能该如何下手??大家帮帮忙啊,急!!我在线等.

[解决办法]
这个功能似乎比较复杂吧
“看起来不太清楚” 怎么定义?
“对比度或者亮度不够” 怎么判断?
“图象本身效果很好” 怎么判断?

先搞清楚这些吧,基本是图像处理的范畴的。

[解决办法]
建议lz先去补充离散函数,复变函数和计算机图形学的基础课程。
这绝对不是一个“小软件”,光其中的数学变换就够写一阵子的了
[解决办法]
1.要不把自动处理的功能变成手动处理的功能?
2.要不我想每个处理都有一个处理的参数,比如说是锐化(参数ruihuaPara),然后先预对该图象处理一下形成一个newImage,处理后对其每个象素点的颜色与oldImage进行比较,比较颜色的近似程度(当然也要一个近似比较程度的参数reihuaNearPara),分别计数大于的和小于近似程度的,大的/总数 > ruihuaPara ? 进行锐化处理 :不进行锐化处理。
[解决办法]
柔滑和锐化处理的代码如下

C# code
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));            }        } 


[解决办法]
可以看有关边缘检测方面的资料,具体怎么做我也说不清楚,你的想法很好
一个自动就难了,

读书人网 >C#

热点推荐