日期:2014-05-18  浏览次数:20990 次

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

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

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

------解决方案--------------------
建议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(25