2019-08-13 11:15:43 qq_24872841 阅读数 113

灰度图

灰度图,Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。

灰度图定义

什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
1.浮点算法:Gray=R0.3+G0.59+B0.11
2.整数方法:Gray=(R
30+G59+B11)/100
3.移位方法:Gray =(R76+G151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。

import numpy as np
import cv2


def gray(image):
    h,w = image.shape[:2]             				    #获取图片的high和wide
    img = np.zeros([h,w],image.dtype)                   #创建一张和当前图片大小一样的图片
    # print(img)
    for i in range(h):
        for j in range(w):
            m = image[i,j]                              #取出当前high和wide中的BGR坐标
            img[i,j] = int(m[0]*0.11 + m[1]*0.59 + m[2]*0.3)   #将BGR坐标转化为gray坐标并赋值给新图像
    print("image show: %s"%img)
    cv2.imshow("image show",img)


src = cv2.imread("./img/02.jpg")
dst = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)             #opencv自带RGB转灰度图api
print("gray: %s"%dst)                                  #查看自带api转灰度图结果的数组
cv2.imshow("gray image",dst)
gray(src)
cv2.waitKey(0)
cv2.destroyAllWindows("image")

运行结果:
自带api转换
opencv自带api转换自己手写转换
对比
两者图片对比

2019-10-29 21:00:33 qq_36511401 阅读数 6307

1、介绍。

    通道。三通道一般指彩色图片,分别为R、G、B通道,我们所见的彩色图片,则是这三个通道叠加的效果。四通道一般是指在三通道的基础上再加上一个透明度的通道。单通道一般指灰度图,但是三通道如果每个像素的三个通道值都相等的话,我们也称为灰度图。

    灰度图。Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。因为彩色图片每个像素有三个字节(24bit)的值,怎么样才能取到一字节(8bit)的灰度等级呢。我们一般有7种方法:最小值法、最大值法、平均值法、加权法、红色值法、绿色值法和蓝色值法。

    下面我会介绍这7种方法,以下图所示的源图为例。

2、代码。生成两个文件夹,一个存放单通道的图像,另一个存放是三通道的图像。每个文件夹都会各生成7种不同方法灰度化处理的图像。至于使用哪种方法,要看具体的例子。

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class ImgTest {
    private static final byte Gray_Type_Min = 1;//最大值法
    private static final byte Gray_Type_Max = 2;//最小值法
    private static final byte Gray_Type_Average = 3;//平均值法
    private static final byte Gray_Type_Weight = 4;//加权法
    private static final byte Gray_Type_Red = 5;//红色值法
    private static final byte Gray_Type_Green = 6;//绿色值法
    private static final byte Gray_Type_Blue = 7;//蓝色值法

    private static final String File_Path = "G:\\xiaojie-java-test\\img\\%s\\%s.jpg";
    private static final String Source_Path = "G:\\xiaojie-java-test\\img\\source.jpg";

    public static void main(String[] args) {
        //图片灰度化
        toGrayImg(Gray_Type_Min, "gray_min");//最大值法
        toGrayImg(Gray_Type_Max, "gray_max");//最小值法
        toGrayImg(Gray_Type_Average, "gray_average");//平均值法
        toGrayImg(Gray_Type_Weight, "gray_weight");//加权法
        toGrayImg(Gray_Type_Red, "gray_color_red");//红色值法
        toGrayImg(Gray_Type_Green, "gray_color_green");//绿色值法
        toGrayImg(Gray_Type_Blue, "gray_color_blue");//蓝色值法
    }

    /**
     * 图片灰度化的方法
     *
     * @param type         灰度化方法
     * @param grayFileName 目标图片文件名
     */
    private static void toGrayImg(int type, String grayFileName) {
        try {
            BufferedImage image = ImageIO.read(new File(Source_Path));
            final int imgWidth = image.getWidth();
            final int imgHeight = image.getHeight();
            BufferedImage bufferedImage_1 = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_BYTE_GRAY);
            BufferedImage bufferedImage_3 = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
            //这边因为只是灰度操作,所以内外循环imgWidth和imgHeight可以随便放
            for (int i = 0; i < imgHeight; i++) {
                for (int j = 0; j < imgWidth; j++) {
                    final int pixel = image.getRGB(j, i);
                    final int[] grb = getRgb(pixel);
                    final int gray = getGray(grb, type);
                    bufferedImage_1.setRGB(j, i, (byte) gray);//这里一定要用byte类型的,不然图片会很暗
                    bufferedImage_3.setRGB(j, i, getPixel(gray, gray, gray));
                    //System.out.print(String.format("%4d ", gray));
                }
                //System.out.println();
            }
            ImageIO.write(bufferedImage_1, "JPEG", new File(String.format(File_Path, "单通道-灰度图", grayFileName)));
            Thread.sleep(1);
            ImageIO.write(bufferedImage_3, "JPEG", new File(String.format(File_Path, "三通道-灰度图", grayFileName)));
            Thread.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //将一个int值转化为3个r、g个b的byte值
    private static int[] getRgb(int pixel) {
        int[] rgb = new int[3];
        rgb[0] = (pixel >> 16) & 0xff;
        rgb[1] = (pixel >> 8) & 0xff;
        rgb[2] = pixel & 0xff;
        return rgb;
    }

    //将3个r、g个b的byte值转化为一个int值
    private static int getPixel(int r, int g, int b) {
        int getPixel = b;
        getPixel += (r << 16);
        getPixel += (g << 8);
        return getPixel;
    }

    //根据不同的灰度化方法,返回byte灰度值
    private static int getGray(int[] rgb, int type) {
        if (type == Gray_Type_Average) {
            return (rgb[0] + rgb[1] + rgb[2]) / 3;   //rgb之和除以3
        } else if (type == Gray_Type_Weight) {
            return (int) (0.3 * rgb[0] + 0.59 * rgb[1] + 0.11 * rgb[2]);
        } else if (type == Gray_Type_Red) {
            return rgb[0];//取红色值
        } else if (type == Gray_Type_Green) {
            return rgb[1];//取绿色值
        } else if (type == Gray_Type_Blue) {
            return rgb[2];//取蓝色值
        }
        //比较三个数的大小
        int gray = rgb[0];
        for (int i = 1; i < rgb.length; i++) {
            if (type == Gray_Type_Min) {
                if (gray > rgb[i]) {
                    gray = rgb[i];//取最小值
                }
            } else if (type == Gray_Type_Max) {
                if (gray < rgb[i]) {
                    gray = rgb[i];//取最大值
                }
            }
        }
        return gray;
    }
}

3、结果。

 

2012-09-23 02:15:33 sm_crystal 阅读数 2944

什么是灰度图像

http://baike.baidu.com/view/1549178.htm

什么是灰阶

通常来说,液晶屏幕上人们肉眼所见的一个点,即一个像素,它是由红、绿、蓝(RGB)三个子像素组成的。每一个子像素,其背后的光源都可以显现出不同的亮度级别。而灰阶代表了由最暗到最亮之间不同亮度的层次级别。这中间层级越多,所能够呈现的画面效果也就越细腻。以8bit panel为例,能表现2的8次方,等于256个亮度层次,我们就称之为256灰阶。LCD屏幕上每个像素,均由不同亮度层次的红、绿、蓝组合起来,最终形成不同的色彩点。也就是说,屏幕上每一个点的色彩变化,其实都是由构成这个点的三个RGB子像素的灰阶变化所带来的。

trackback:http://baike.baidu.com/view/92687.htm

灰阶和图像

多个具有不同灰阶的像素点形成一个矩阵,这个矩阵显示的效果就是一幅图像。这个道理就像朝鲜10余万人同台演出的大型团体操和艺术表演《阿里郎》,

进阶

为了获取更加细腻的表现细节,我们也可以把这些灰度级增大。

一般图像的灰阶:0-255 ,2的8次个亮度层次。对应的,使用一个字节来保存(1byte = 8bit)

我们可以加大灰度级,例如可以采用10bit来表达灰度层级,2的10次方=1024,明显比常规的256个层次更有表现力。这里,我们可以使用2btye来存储一个像素点。表现力增强了,但是对应的图像也一下子增大了不少,并且对应的图像处理,也就需要更多的计算。




2015-12-16 16:53:33 shenziheng1 阅读数 1671

1.灰阶图像形态学

二值图像形态学向灰度空间的一个扩展。同样包含Dilation(膨胀)、Erosion(腐蚀)、Opening(开运算)、Closing(闭运算)。灰度图像形态学运算同时作用在位置和图像灰度值上,最终形成新的图像。


2.灰阶图像形态学基本运算

2.1 Grayscale Dilation(膨胀)

2.1.1 数学表达


举例说明:

F=(7 9 8 3 8 9 9); K=(-3 0* -3)  【其实质就是空间位移变动与灰度变动的过程】 *:代表中心点

-3 :7 9 8 3 8 9 9                 左移一位

4 6 5 0 5 6 6 # #           灰度变化

0* :# 7 9 8 3 8 9 9 #            中心位置,不用平移,直接灰度改变

-3 :# # 4 6 5 0 5 6 6            右移一位,叠加灰度值

结果4 7 9 8 5 8 9 9 6  (尺寸和灰度值都变大了,图像将会表现明显的变亮)


结论:相当于我们用SE的一半,在图像上方滑动,最终图像的轨迹。

2.2 Erosion(腐蚀)


同样的例子:

F=(7 9 8 3 8 9 9); K=(-3 0* -3)  【其实质就是空间位移变动与灰度变动的过程】 *:代表中心点

对于Erosion就是减号,注意哦。

-3 :#   #  7     9    8   3    8   9   9                 右移一位

#   #  10  12  11  6   11 12 12            灰度变化

0* :#   7   9    8   3    8   9   9    #            中心位置,不用平移,直接灰度改变

-3 :10 12 11  6  11  12  12  #   #           左移一位,叠加灰度值

结果 #   #   9   6   3    6    9   #    #(优先选择#,然后选择最小值)  (尺寸和灰度值都变小了,图像将会表现明显的暗)




我们会发现白的区域受到了腐蚀,变小了;而黑区变大了,受到了膨胀。

2.3 Opening(开运算)


我们发现,开运算的效果相当于,用半个SE沿灰度图下方移动,如果移动受阻就会“自动的屏蔽该处的灰度信息”;也就是说,Opening运算对于去除图像中的白点,或者白色的噪声具有非常好的效果。只要求我们的SE半径大于“亮点”直径。

和Erosion效果相似,却有很大的不同,保留图像大量的信息,仅对小于SE半径的“白点”进行“侵蚀”,变黑。

2.4 Closing(闭运算)


我们发现,Closing运算,是自上而下的对图像进行处理,结果是,保留了图像大部分信息,对特定部分进行填埋。很明显,我们可以看到,整幅图像的灰度是变大了。


我们可以总结出,图形的效果的确变亮了。与Dilation操作相比,Closing操作保留了大部分的信息,进度细节部分进行了白色的侵蚀。

2.5 四种基本运算进行总结对比


1.四种运算都会对图像的纹理,进行一个平滑。Dilation和Closing对于细节进行了明显膨胀,图像整体灰度增加;Erosion和Opening对“细节”进行了明显的腐蚀,在图像灰度波动频繁的区域操作,会变暗,变得平滑。

2.由于一幅图像大部分区域都是平缓的。我们可以看出,Erosion和Dilation操作在平滑图像的基础上,对图像的整体都进行了腐蚀或者膨胀。而Closing和Opening运算却不一样,仅仅对灰度变化极其频繁(频率大)的区域进行平滑,对图像的缓和区(大部分区域)没有任何影响。


3.基本运算的Matlab仿真以及结果分析

3.1  Dilation实验


3.2 Erosion 实验


3.3 Opening实验


3.4 Closing实验


2013-04-08 21:34:36 mlkiller 阅读数 1457

本人水平有限,从最简单的图像处理算法写起,希望能和大家共同提高。


这一章主要写灰度图的相关知识。

一 灰度图定义

参考百度百科http://baike.baidu.com/view/1184366.htm

Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色黑色之间按对数关系分为若干等级,称为灰度。灰 度分为256阶。用灰度表示的图像称作灰度图
什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
1.浮点算法:Gray=R*0.3+G*0.59+B*0.11
2.整数方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。
维基百科:

计算机领域中,灰度(Gray scale)数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。但是,在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像。

http://zh.wikipedia.org/wiki/%E7%81%B0%E5%BA%A6%E5%9B%BE%E5%83%8F


二 灰度的计算

既然我们知道了灰度图的定义,那么我们怎么计算灰度图呢?

首先,申请灰度图的空间,空间大小为 width * height * sizeof(char), 如果使用一个char来表示颜色的,即0-255.

    

out.create(input.cols,input.rows,CV_8UC1);

然后,通过上面的公式进行计算,代码部分如下:

公式一:Gray=R*0.3+G*0.59+B*0.11;

 int i,j;
    uchar* p;
	uchar* q;
	uchar R,G,B;
    for( i = 0; i < nRows; ++i)
    {
        p = input.ptr<uchar>(i);
		q = out.ptr<uchar>(i);
        for ( j = 0; j < nCols; ++j)
        {
		    B = p[j * nChannels];
		    G =  p[j * nChannels + 1];
			R =  p[j * nChannels + 2];
			q[j] = 0.299 * R + 0.587 * G + 0.114*B;
			
        }
    }

         公式二:Gray =(R*76+G*151+B*28)>>8;

   只是把上面的那句话替换掉。

三 效果和效率

先看一下效率,原始方法和乘法基本一致,位移的效率要快一倍,所以在大型实时系统中,用位移代替乘法和除法就是一种很好的优化方法。
系统的方法应该有一些并行计算的内容,在很多情况下效果应该都比这个测试的结果要好一点,应该是我自己的机器开东西太多的原因,导致另外一个核比较慢,所以这里效率才比较低。
运行效率


效果呢?

系统方法 乘法 移位
系统方法 乘法 移位

肉眼上没有太大差距

图像处理方法

阅读数 177

没有更多推荐了,返回首页