图像处理中的像素

2018-10-02 17:47:40 qq_36554582 阅读数 18157

参考博文地址:https://blog.csdn.net/jiugedexiaodi/article/details/79661441
首先我们用MATLAB打开一张图像可以发现在工作区中就会多一个变量,这个变量是一个三维数组,第一维代表图像的X坐标,第二维代表图像的Y坐标,第三维代表R、G、B,第三维中的数字1代表R,数字2代表G,数字3代表B。
如下图,我打开一张图片,在MATLAB工作区就会出现这样一个变量,变量名字是自己设定的

然后我们可以把这三个分量给分离开,并且可以绘制出各个分量的图像,代码如下:

%读取一张图片,并显示
original_picture=imread('C:\Users\MyPC\Desktop\cat.jpg');
subplot(2,2,1);
imshow(original_picture);
title('原始图像的直方图')

%分别读取R、G、B的值,1代表R,2代表G,3代表B
image_r=original_picture(:,:,1);
image_g=original_picture(:,:,2);
image_b=original_picture(:,:,3);
subplot(222)
imshow(image_r);
title('R  Part');

subplot(223)
imshow(image_g);
title('G  Part');

subplot(224)
imshow(image_b);
title('B  Part');


然后我们可以随便看一下分离出来的三个变量中的一个,假如说我要看原始图像中R的分量的像素矩阵,我们可以直接在MATLAB的工作区中点击对应的变量名称即可:
在这里插入图片描述
点击之后,我们就可以看到一个二维矩阵,这个二维矩阵就是原始图像中R的分量的像素矩阵

这个矩阵为640*640的,即640行、640列,这是和你原始图像的分辨率有关系的应该。每一个单元格的数值就代表了原始数据中那一个坐标点的R分量的数值。
接下来,我们可以继续画出相对应的直方图,直方图具体是个啥,目前我还不是很清楚

%画直方图
GrayPic=rgb2gray(original_picture);%把RGB图像转化成灰度图像,imhist()函数的参数好像只能是二维的图像,不能是三维的,所以这里先把原始彩色图像转化为灰度图像
hist_image=imhist(GrayPic);%原始图像的灰度图像的直方图
hist_r=imhist(image_r);%R部分的直方图
hist_g=imhist(image_g);%G部分的直方图
hist_b=imhist(image_b);%B部分的直方图
figure(2)
subplot(221)
bar(hist_image);
title('原始图像的灰度图像的直方图')

subplot(222)
bar(hist_r);
title('R部分的直方图')
subplot(223)
bar(hist_g);
title('G部分的直方图')
subplot(224)
bar(hist_b);
title('B部分的直方图')

2018-07-06 16:33:53 qauchangqingwei 阅读数 12988
1、像素点
​像素点是最小的图像单元,一张图片由好多的像素点组成。如下图

     


可以看到上述图片尺寸是500 * 338 的,表示图片是由一个500 * 338的像素点矩阵构成的,这张图片的宽度是500个像素点的长度,高度是338个像素点的长度,共有500 * 338 = 149000个像素点。

2、像素
把鼠标放在一个图片上,这个时候会显示尺寸和大小,这里的尺寸就是像素。

3、RGB
因为一个像素点的颜色是由RGB三个值来表现的,所以像素点矩阵对应三个颜色向量矩阵,分别是R矩阵(500 *338大小),G矩阵(500 *338大小),B矩阵(500 *338大小)。如果每个矩阵的第一行第一列的值分别为:R:240,G:223,B:204,所以这个像素点的颜色就是(240,223,204)


4、灰度

灰度是表明图像明暗的数值,即黑白图像中点的颜色深度,范围一般从0到255,白色为
255 ,黑色为0,故黑白图片也称灰度图像。灰度值指的是单个像素点的亮度。灰度值越
大表示越亮。


5、图像的灰度化
 灰度就是没有色彩,RGB色彩分量全部相等。图像的灰度化就是让像素点矩阵中的每一个像素点都满足关系:R=G=B,此时的这个值叫做灰度值。如RGB(100,100,100)就代表灰度值为100,RGB(50,50,50)代表灰度值为50。


灰度化处理
一般灰度化处理的方法:在灰度化的图像中灰度值的范围为0~255
1.浮点算法:Gray=R*0.3+G*0.59+B*0.11                R=G=B
2.整数方法:Gray=(R*30+G*59+B*11)/100              R=G=B
3.移位方法:Gray =(R*28+G*151+B*77)>>8            R=G=B
4.平均值法:Gray=(R+G+B)/3                            R=G=B
5.仅取绿色:Gray=G                                              R=G=B

二值化处理的方法:
二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),也就是让整个图像呈现只有黑和白的效果。在二值化后的图像中的灰度值范围是0或者255。那么一个像素点在灰度化之后的灰度值怎么转化为0或者255呢?比如灰度值为100,那么在二值化后到底是0还是255?这就涉及到取一个阀值的问题。

1、取阀值为127(相当于0~255的中数,(0+255)/2=127),让灰度值小于等于127的变 为0(黑色),灰度值大于127的变为255(白色),这样做的好处是计算量小速度快,但是 缺点也是很明显的,因为这个阀值在不同的图片中均为127,但是不同的图片,他们的颜色分布差别很大,所以用127做阀值,白菜萝卜一刀切,效果肯定是不好的。
2、计算像素点矩阵中的所有像素点的灰度值的平均值avg
(像素点1灰度值+…+像素点n灰度值)/ n = 像素点平均值avg,然后让每一个像素点与avg一 一比较,小于等于avg的像素点就为0(黑色),大于avg的 像 素点为255(白色),这样做比方法1好一些。
3、使用直方图方法(也叫双峰法)来寻找二值化阀值,直方图是图像的重要特质。直方图方法 认为图像由前景和背景组成,在灰度直方图上,前景和背景都形成高峰,在双峰之间的最低谷处就是阀值所在。取到阀值之后再一 一比较就可以了。


6、灰度值与像素值的关系
如果对于一张本身就是灰度图像(8位灰度图像)来说,他的像素值就是它的灰度值,如果是一张彩色图像,则它的灰度值需要经过函数映射来得到。灰度图像是由纯黑和纯白来过渡得到的,在黑色中加入白色就得到灰色,纯黑和纯白按不同的比例来混合就得到不同的灰度值。R=G=B=255为白色,R=G=B=0为黑色,R=G=B=小于255的某个整数时,此时就为某个灰度值。


7、灰度级

灰度级表明图像中不同灰度的最大数量。灰度级越大,图像的亮度范围越大。


8、图像分辨率

图像分辨率是指每英寸图像内的像素点数。图像分辨率是有单位的,叫ppi(像素每英寸)。分辨率越高,像素的点密度越高,图像越逼真(这就是为什么做大幅的喷绘时,要求图片分辨率要高,就是为了保证每英寸的画面上拥有更多的像素点)。


9、空间分辨率

空间分辨率是指图像可辨认的临界物体空间几何长度的最小极限。如果一幅图像的尺寸为MxN,表明在成像时采集了MxN个样本,空间分辨率是MxN。下图是空间分辨率从1024x1024、512x512、256x256、128x128、64x64、32x32pixels


10、幅度分辨率

幅度分辨率是指幅度离散,每个像素都有一个强度值,称该像素的灰度,一般量化采用8bit。例如8bit的灰度级为2的八次方即256。0~255



11、屏幕分辨率

屏幕分辨率是屏幕每行的像素点数*每列的像素点数,每个屏幕有自己的分辨率。屏幕分辨率越高,所呈现的色彩越多,清晰度越高。

12、图像所需要的位数b

b=MxNxK      MxN是空间分辨率 ;K幅度分辨率,单位是bit

存储1幅32 x 32,16个灰度级的图需要 4,096 bit

存储1幅512 x 512,256个灰度级的图需要 2,097,152 bit 



附加:

13、对比度:指一幅图中灰度反差的大小

对比度 =  最大亮度/最小亮度


14、与清晰度相关的因素:

亮度

对比度

尺寸大小

细微层次

颜色饱和度

        </div>
            </div>
            转载来源于     https://blog.csdn.net/strive_0902/article/details/78023080 
            版权归作者所有
2017-11-27 19:32:40 xjh_shin 阅读数 9579

一张图片放大以后就会呈现一个个的点阵,每一个点就是一个像素点,通过我们对RGB的颜色配比就可以显示出不同的颜色效果了,所以说最终我们想对一个图像进行处理的话就是对一个个像素点进行处理。
最著名的就是以下几种效果,我们分别在ImageHelper中加入了handleImageNegative方法,handleImagePixelsOldPhoto方法以及handleImagePixelsRelief方法,其实这三个方法没有什么区别只是对每一个像素点的RGBA的处理有所改变:
底片效果:其实说白了就是把每个点的RGB都让他被255减去(255-R,255-G,255-B),这样处理以后就可以得到底片效果了。

public static Bitmap handleImageNegative(Bitmap bm) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    int color;//存取当前像素点的颜色
    int R, G, B, A;//存取当前像素点的RGBA
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    int[] oldPx = new int[width * height];
    int[] newPx = new int[width * height];
    bm.getPixels(oldPx, 0, width, 0, 0, width, height);//存储像素点的数组,起点需要偏移的量,读取数组的行距,第一次读取像素点的坐标(x,y),读取的长度,读取的宽度
    for (int i = 0; i < width * height; i++) {
        color = oldPx[i];
        //分离出RGBA四个分量
        R = Color.red(color);
        G = Color.green(color);
        B = Color.blue(color);
        A = Color.alpha(color);
        R = 255 - R;
        G = 255 - G;
        B = 255 - B;
        if (R > 255) {
            R = 255;
        } else if (R < 0) {
            R = 0;
        }
        if (G > 255) {
            G = 255;
        } else if (G < 0) {
            G = 0;
        }
        if (B > 255) {
            B = 255;
        } else if (B < 0) {
            B = 0;
        }
        newPx[i] = Color.argb(A, R, G, B);
    }
    bmp.setPixels(newPx, 0, width, 0, 0, width, height);
    return bmp;
}

老照片效果(就是之前博客的那个效果):
newR = (int) (0.393 * r + 0.769 * g + 0.189 * b);
newG = (int) (0.349 * r + 0.686 * g + 0.168 * b);
newB = (int) (0.272 * r + 0.534 * g + 0.131 * b);

public static Bitmap handleImagePixelsOldPhoto(Bitmap bm) {
    Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(),
            Bitmap.Config.ARGB_8888);
    int width = bm.getWidth();
    int height = bm.getHeight();
    int color = 0;
    int r, g, b, a, r1, g1, b1;

    int[] oldPx = new int[width * height];
    int[] newPx = new int[width * height];

    bm.getPixels(oldPx, 0, bm.getWidth(), 0, 0, width, height);
    for (int i = 0; i < width * height; i++) {
        color = oldPx[i];
        a = Color.alpha(color);
        r = Color.red(color);
        g = Color.green(color);
        b = Color.blue(color);

        r1 = (int) (0.393 * r + 0.769 * g + 0.189 * b);
        g1 = (int) (0.349 * r + 0.686 * g + 0.168 * b);
        b1 = (int) (0.272 * r + 0.534 * g + 0.131 * b);

        if (r1 > 255) {
            r1 = 255;
        }
        if (g1 > 255) {
            g1 = 255;
        }
        if (b1 > 255) {
            b1 = 255;
        }

        newPx[i] = Color.argb(a, r1, g1, b1);
    }
    bmp.setPixels(newPx, 0, width, 0, 0, width, height);
    return bmp;
}

浮雕效果:B.R=C.R-B.R+127;B.G=C.G-B.G+127;B.B=C.B-B.B+127;(C为前一个点的原RGBA的值)

public static Bitmap handleImagePixelsRelief(Bitmap bm) {
    Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(),
            Bitmap.Config.ARGB_8888);
    int width = bm.getWidth();
    int height = bm.getHeight();
    int color = 0, colorBefore = 0;
    int a, r, g, b;
    int r1, g1, b1;

    int[] oldPx = new int[width * height];
    int[] newPx = new int[width * height];

    bm.getPixels(oldPx, 0, bm.getWidth(), 0, 0, width, height);
    for (int i = 1; i < width * height; i++) {
        colorBefore = oldPx[i - 1];
        a = Color.alpha(colorBefore);
        r = Color.red(colorBefore);
        g = Color.green(colorBefore);
        b = Color.blue(colorBefore);

        color = oldPx[i];
        r1 = Color.red(color);
        g1 = Color.green(color);
        b1 = Color.blue(color);

        r = (r - r1 + 127);
        g = (g - g1 + 127);
        b = (b - b1 + 127);
        if (r > 255) {
            r = 255;
        }
        if (g > 255) {
            g = 255;
        }
        if (b > 255) {
            b = 255;
        }
        newPx[i] = Color.argb(a, r, g, b);
    }
    bmp.setPixels(newPx, 0, width, 0, 0, width, height);
    return bmp;
}

然后就可以显现出来了,这部分因为颜色处理的算法是确定的所以把上面的看懂了就能搞懂了,我就把效果给大家看下吧,布局文件和活动的代码特别简洁就不贴上来了。
像素点

项目GitHub地址:传送门

2019-12-02 20:15:20 qq_31347869 阅读数 455

查看一张图片的详细信息,包含:
在这里插入图片描述
图像尺寸:表示图像的宽度和高度,以像素(或 cm、mm、inch 等)为单位,表示在图像横边和竖边上各有多少个像素;

图像分辨率:表示单位面积内的像素数量,即像素密度。单位通常是 dpi,即像素点与长度单位英寸的比值。

像素转毫米:

需要知道 DPI(dots per inch) 参数,即每英寸多少点。另外,一英寸 = 25.4 mm

  • 像素数 / DPI = 英寸数
  • 英寸数 ×\times 25.4 = 毫米数

一般来说,DPI = 96,一毫米 ≈ 3.78 像素

# x,y 为像素数,w,h为毫米
水平方向:w = x * 25.4 / dpi
垂直方向:h = y * 25.4 / dpi

毫米转像素:

# x,y 为像素数,w,h为毫米
水平方向:x = w * dpi / 25.4
垂直方向:y = h * dpi / 25.4
2017-06-28 22:02:59 DdiIcey 阅读数 16699

图像的像素的意义

一幅图像,经过取样和量化之后就可以得到数字图像。数字图像在存储时,都是由单一的像素保存在存储设备中。像素保存顺序是与像素在数字图片中原本所处在的物理位置相关,那么就要了解像素之间的一些基本关系。

在数字图像处理领域,存在着空间域和变换域的概念。数字图像处理的基本操作,有些需要在空间域中进行,而另外的一些则需要在变换域中进行。
空间域:就是指图像的本身,由所采集到的一个个像素组成。对目标像素进行常用的处理方法,例如灰度变换和空间滤波两大类。
变换域:通过特定的变换函数,将图像的像素变化到目标域中,在变换域中完成相应的操作运算后,再利用反变换核返回到空间域。
由上可知,无论在空间域还是在变换域,像素都是根本。在大多数的数字图像处理中,像素之间在运算时都是要发生关系的,这是因为多个像素构成了图像中的一个对象。

图像是由像素的形式来保存的,所以我们以f(x,y)来表示图像,对于特定像素,分别用p和q来表示。

相邻像素

在这节中主要讨论一个像素p的所有的相邻像素,所有的相邻像素与像素p的距离均不超过√2。.
位于坐标(x,y)处的像素p,在水平和垂直方向分别有两个像素与其相邻,对应坐标为:
(x+1,y), (x-1,y), (x,y+1), (x,y-1)
这一组像素称为像素p的4邻域,用N_4 (p)来表示。
对于同样的像素p,在其对角方向有4个像素与其相邻,对应坐标为:
(x-1,y-1), (x-1,y+1), (x+1,y-1), (x+1,y+1)
这一组像素用N_D (p)来表示。
上面的8个坐标点,构成了像素p的8邻域,用N_8 (p)来表示。
在讨论像素点的时候,会遇到这样的情况:像素p位于图像的边界,这样无论是N_4 (p),N_D (p)都有一些点是不存在的,在目前,讨论这些像素点是没有任何意义。在做特定像素运算的时候,再根据运算的性质来确定如何来处理边界像素的相邻像素。

下图为相邻像素的示意图:


N_8 (p)= N_4 (p)+ N_D (p)

邻接性、连通性

在灰度图像中,假如灰度位数为8bit,那么所有的可能灰度取值范围为[0,255]。为了方便讨论和分析,现只考虑二值图像,即灰度值只有0和1两种情况。定义V为所要讨论的像素的邻接性灰度值集合。则在二值图像中V={1}。分析三种类型的邻接:
  • 4邻接。如果像素q在集合N_4 (p)中,则具有V中灰度值的两个像素q和p是4邻接的。
  • 8邻接。如果像素q在集合N_8 (p)中,则具有V中灰度值的两个像素q和p是8邻接的。
  • m邻接。如果(1)q在集合N_4 (p)中,或者(2) 像素q在集合N_D (p)中,且集合N_4 (p)∩N_4 (q)没有来自V中灰度值的像素,则具有V中数值的两个像素p和q是m邻接的。
对于邻接性,更鲜明扼要的解释如下:
  • 4邻接。像素p q的灰度值属于集合V,像素q在N_4 (p)中
  • 8邻接。像素p q的灰度值属于集合V,像素q在N_8 (p)中
  • m邻接。像素p q的灰度值属于集合V,像素q在N_4 (p)中或者像素q在N_D (p)中,且集合N_4 (p)∩N_4 (q)没有来自V中数值的像素。

下图分别给出了4邻接,8邻接,m邻接的示意图。




接下来需要考虑一个问题,在有8邻接后,为什么要引入m邻接的定义呢?在《数字信号处理》2.5.2节中,作者给出的原因是,ml邻接主要是为了消除8邻接的二义性。那么,二义性怎么体现呢?首先来解释什么是像素的通路。

像素的通路

从坐标(x,y)的像素p到坐标为(s,t)的像素q的通路,是由一系列的特定像素组成的序列,其坐标为:
(x0,y0), (x1,y1), …, (xn,yn)
其中(x0,y0) = (x,y), (xn,yn) = (s,t). 并且像素(xi,yi)和(xi-1,yi-1)对于1≤i≤n是邻接的(4邻接,8邻接,m邻接)。在这种情况下,n是通路的长度。从像素p到像素q就形成了一个像素通路。

当按照特定的邻接性来确认像素的通路时,必须保证通路的唯一性,在下图的例子中,如果选择8邻接,则通路并不是唯一的,所以具有二义性。当考虑m邻接的时候,则通路就是唯一的,这就是m邻接可以消除8邻接的二义性体现。



由上图可以看出,在从像素p到像素q的通路中,如果考虑8邻接,那么通路就不具有唯一性。


令S是图像中的一个像素子集,如果S的全部像素之间存在一个通路,则可以说两个像素p和q在S中是连通的。对于S中的任何像素p,S中连通到该像素的像素集成为S的连通分量。如果S仅有一个连通分量,则集合S成为连通集。概括来说,S中的所有的像素,每两个相邻的像素之间是相邻接的(4,8,m),并且只有一个通路,那么S为连通集。

令R是图像中的一个像素子集。如果R是连通集,则R被称作为一个区域。两个区域Ri和Rj如果能形成一个连通集,那么称这两个区域为邻接区域。不过在讨论是否为邻接区域的时候,只能考虑区域边界的像素是否构成4邻接和8邻接,而不考虑m邻接。在定义区域邻接的时候,必须指定邻接类型。

注意:在《数字图像处理第三版》的2.5.2节中,“不邻接的区域称为不连接区域”应该是错误,修改成“不邻接的区域称为不邻接区域”。