Python 图像处理(一)PIL

Python 图像处理(一)PIL

H5游戏开发:消灭星星

2018/01/25 · HTML5 ·
游戏

初稿出处: 坑坑洼洼实验室   

「消灭星星」是一款很经典的「消除类游戏」,它的玩法相当粗略:化解相连通的同色砖块。

图片 1

先前做图像处理时用的是matlab,不过matlab有一部分不便于支出:

图像色彩处理


Android对图纸的拍卖,平日使用的数据结构便是位图—Bitmap,它包涵了一张图纸的保有数据。整个图片都以由点阵和颜色值组成的,点阵正是一个富含像素的矩阵,每三个因素对应着图片的3个像素,颜色值—ARAV4GB,分别对应反射率、红、绿、蓝那三个通道分量,它们一起决定了各样像素点展现的水彩,对图片的情调解和处理理实际上正是对这几个像素点的大道分量做调整。

在色彩处理中,平日从三个角度来叙述二个图像。

  • 颜色:色彩的完整援助
  • 饱和度:颜色的纯度,从0(灰)到百分百(饱和)来展开描述
  • 亮度:颜色的相持明暗程度

在android中,系统使用二个颜料矩阵—ColorMatrix,来处理图像的这几个色彩效果。Android中颜色矩阵是2个4×5的矩阵,它用来对图纸的色彩实行处理。而对此各类像素点,都有1个颜料分量矩阵用来保存颜色的RubiconGBA值,如下图所示:

图片 2

颜色矩阵A

图片 3

每种像素点的颜料分量矩阵C

在拍卖图像时,使用矩阵乘法运算AC来处理颜色分量矩阵,如下图所示:

图片 4

矩阵乘法运算

计量进度:
     R1 = a * R + b * G + c * B + d * A + e;
     G1 = f * R + g * G + h * B + i * A + j;
     B1 = k * R + l * G + m * B + n * A + o;
     A1 = p * R + q * G + r * B + s * A + t;

可以窥见,对于颜色矩阵A是按以下措施划分的:
    * 第2行的a b c d e值决定新的颜色值中的CRUISER分量—铁灰
    * 第①行的f g h i j值决定新的颜色值中的G分量—玛瑙红
    * 第二行的k l m n o值决定新的颜色值中的B分量—黄色
    * 第⑥行的p q r s t值决定新的颜色值中的A分量—反射率
    * 矩阵A中的第5列—e j o t值分别控制各种分量中的offset,即偏移量

想要对原图片实行颜色的调整,就须求设置好用于调整颜色的矩阵A

图片 5

原始矩阵

通常有二种办法:
壹 、改变偏移量
将矩阵A的第④列的值实行改动,即改变颜色的偏移量,别的值保持开端矩阵的值

图片 6

变动颜色偏移量

  原图片各类像素点的矩阵黄褐和紫褐的颜料分量都增多了100,红绿混合为香艳,最后会使得整张图片偏黄。
贰 、改变颜色周全
修改颜色分量中的有些周全值,别的值如故维持开始矩阵的值

图片 7

变更颜色周全

  矩阵运算后,原图片每种像素点的矩阵草地绿的颜色分量会化为原来的两倍,最后使得原图片的颜色偏绿。

录像与图像凯雷德GB/YUV格式详解(转)
处理器彩色显示器彰显色彩的法则与多彩TV一样,都以行使中华V(Red)G(格林)B(Blue)相加混色的规律:通过发出出两种分裂强度的电子束,使显示器内侧覆盖的红影青磷光材质发光而发非凡彩那种色彩的代表方法称为KoleosGB色彩空间表示(它也是多媒体电脑技术中用得最多的一种色彩空间表示方法)
依照三本色原理,任意一种色光F都能够用差异分量的大切诺基GB三色相加混合而成
F = r [ R ] + g [ G ] + b [ B ]
当中,rgb分别为三本色到场混合的全面当三本色分量都为0(最弱)时混合为墨玉绿光;而当三本色分量都为k(最强)时混合为土灰光调整rgb多个全面的值,能够勾兑出介于金红光和水晶色光之间的见惯司空的色光
那么YUV又从何而来呢?在现世彩电系统中,平日使用三管彩色摄像机或彩色CCD摄像机举办拍片,然后把摄得的彩色图像信号经分色分别放中校对后获得卡宴GB,再通过矩阵变换电路获得亮度信号Y和八个色差信号奔驰M级-Y(即U)B-Y(即V),最后发送端将亮度和色差五个信号分别开始展览编码,用同一信道发送出去这种色彩的表示方法就是所谓的YUV色彩空间表示
使用YUV色彩空间的主尽管它的亮度信号Y和色度信号UV是分离的比方唯有Y信号分量而从不UV分量,那么那样表示的图像就是黑黄绿度图像彩色TV选取YUV空间正是为了用亮度信号Y化解彩色电视与黑白电视接收机的包容难点,使黑白电视机机也能选择彩电信号
YUV与福睿斯GB相互转换的公式如下(途锐GB取值范围均为0-255):
Y = 0.299R + 0.587G + 0.114B
U = -0.147R – 0.289G + 0.436B
V = 0.615R – 0.515G – 0.100B
R = Y + 1.14V
G = Y – 0.39U – 0.58V
B = Y + 2.03U
在DirectShow中,常见的HighlanderGB格式有福睿斯GB1OdysseyGB4XC60GB8LANDGB565RGB555科雷傲GB24HavalGB32AOdysseyGB32等;常见的YUV格式有YUY2YUYVYVYUUYVYAYUVY41PY411Y211IF09IYUVYV12YVU9YUV411YUV420等作为摄像媒体类型的相助表达项目(Subtype),它们对应的GUID见表2.3
表2.3 常见的RGB和YUV格式
GUID 格式描述
MEDIASUBTYPE_OdysseyGB1 2色,每一种像素用1个人表示,需求调色板
MEDIASUBTYPE_大切诺基GB4 16色,每一种像素用3位表示,须求调色板
MEDIASUBTYPE_牧马人GB8 256色,每一个像素用陆人代表,需求调色板
MEDIASUBTYPE_帕杰罗GB565 每一个像素用15个人表示,卡宴GB分量分别使用伍个人八位三人
MEDIASUBTYPE_索罗德GB555 各类像素用14个人代表,XC60GB分量都施用7位(剩下的一位不用)
MEDIASUBTYPE_RGB24 各样像素用2四个人代表,ENCOREGB分量各使用伍人
MEDIASUBTYPE_PAJEROGB32 各个像素用三1三位表示,奥德赛GB分量各使用陆个人(剩下的七个人不要)
MEDIASUBTYPE_A奥迪Q7GB32 每一个像素用叁十三个人表示,OdysseyGB分量各使用五人(剩下的8个人用于表示Alpha通道值)
MEDIASUBTYPE_YUY2 YUY2格式,以4:2:2情势包裹
MEDIASUBTYPE_YUYV YUYV格式(实际格式与YUY2相同)
MEDIASUBTYPE_YVYU YVYU格式,以4:2:2格局卷入
MEDIASUBTYPE_UYVY UYVY格式,以4:2:2形式包裹
MEDIASUBTYPE_AYUV 带Alpha通道的4:4:4 YUV格式
MEDIASUBTYPE_Y41P Y41P格式,以4:1:1形式包裹
MEDIASUBTYPE_Y411 Y411格式(实际格式与Y41P一模一样)
MEDIASUBTYPE_Y211 Y211格式
MEDIASUBTYPE_IF09 IF09格式
MEDIASUBTYPE_IYUV IYUV格式
MEDIASUBTYPE_YV12 YV12格式
MEDIASUBTYPE_YVU9 YVU9格式
下边分别介绍各类牧马人GB格式
¨ 库罗德GB1RubiconGB4牧马人GB8都是调色板类型的福特ExplorerGB格式,在描述这几个媒体类型的格式细节时,经常会在BITMAPINFOHEADE君越数据结构前边随着三个调色板(定义一文山会海颜色)它们的图像数据并不是真的的水彩值,而是当前像素颜色值在调色板中的索引以锐界GB1(2色位图)为例,比如它的调色板中定义的二种颜色值依次为0x000000(水草绿)和0xFFFFFF(卡其色),那么图像数据001101010111(每一个像素用一人表示)表示对应各像素的颜料为:黑黑白白黑白黑白黑白白白
¨ XC60GB565使用十5人表示二个像素,那十七人中的八人用于GL450,伍位用于G,6人用于B程序中常见使用二个字(WO福特ExplorerD,三个字非凡五个字节)来操作2个像素当读出三个像素后,那一个字的各样位意义如下:
高字节 低字节
R R R R R G G G G G G B B B B B
能够整合使用屏蔽字和移动操作来获得库罗德GB各分量的值:
#define RGB565_MASK_RED 0xF800
#define RGB565_MASK_GREEN 0x07E0
#define RGB565_MASK_BLUE 0x001F
R = (wPixel & RGB565_MASK_RED) >> 11; // 取值范围0-31
G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值范围0-63
B = wPixel & RGB565_MASK_BLUE; // 取值范围0-31
¨ CR-VGB555是另一种十六人的劲客GB格式,PAJEROGB分量都用6位代表(剩下的一位不用)使用1个字读出3个像素后,那些字的逐条位意义如下:
高字节 低字节
X PRADO 大切诺基 奥迪Q5 讴歌RDX G G G G G B B B B B (X表示不用,可以忽略)
能够组成使用屏蔽字和平运动动操作来取得OdysseyGB各分量的值:
#define RGB555_MASK_RED 0x7C00
#define RGB555_MASK_GREEN 0x03E0
#define RGB555_MASK_BLUE 0x001F
R = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31
G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31
B = wPixel & RGB555_MASK_BLUE; // 取值范围0-31
¨ CRUISERGB24使用二十多少人来表示一个像素,HavalGB分量都用伍位代表,取值范围为0-255专注在内部存款和储蓄器中LacrosseGB各分量的排列顺序为:BG卡宴 BG路虎极光 BGRubicon常常能够接纳揽胜GBT奥迪Q5IPLE数据结构来操作多少个像素,它的定义为:
typedef struct tagRGBTRIPLE {
BYTE rgbtBlue; // 深青莲分量
BYTE rgbt格林; // 煤黑分量
BYTE rgbtRed; // 海水绿分量
} RGBTRIPLE;
¨ 奇骏GB32使用三19人来代表1个像素,纳瓦拉GB分量各用去7位,剩下的5人用作Alpha通道大概不用(ATucsonGB32就是带Alpha通道的福特ExplorerGB32)注目的在于内部存款和储蓄器中EscortGB各分量的排列顺序为:BGRA BGRA BGRA经常能够利用兰德TucsonGBQUAD数据结构来操作1个像素,它的概念为:
typedef struct tagRGBQUAD {
BYTE rgbBlue; // 深青莲分量
BYTE rgbGreen; // 金黄分量
BYTE rgbRed; // 白色分量
BYTE rgbReserved; // 保留字节(用作Alpha通道或不经意)
} RGBQUAD;
上边介绍各个YUV格式YUV格式平时有两大类:打包(packed)格式和平面(planar)格式前者将YUV分量存放在同1个数组中,平时是多少个相邻的像素组成贰个宏像素(macro-pixel);而后人使用两个数组分开存放YUV多少个轻重,就如七个三维平面一样表2.3中的YUY2到Y211都是打包格式,而IF09到YVU9都以平面格式(注意:在介绍各个具体格式时,YUV各分量都会包涵下标,如Y0U0V0表示第①个像素的YUV分量,Y1U1V1代表第③个像素的YUV分量,以此类推)
¨ YUY2(和YUYV)格式为种种像素保留Y分量,而UV分量在档次方向上每七个像素采集样品2次三个宏像素为多少个字节,实际表示2个像素(4:2:2的情致为三个宏像素中有八个Y分量三个U分量和二个V分量)图像数据中YUV分量排列顺序如下:
Y0 U0 Y1 V0 Y2 U2 Y3 V2
¨ YVYU格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所分歧:
Y0 V0 Y1 U0 Y2 V2 Y3 U2
¨ UYVY格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所不一致:
U0 Y0 V0 Y1 U2 Y2 V2 Y3
¨ AYUV格式带有一个Alpha通道,并且为种种像素都提取YUV分量,图像数据格式如下:
A0 Y0 U0 V0 A1 Y1 U1 V1
¨ Y41P(和Y411)格式为各个像素保留Y分量,而UV分量在档次方向上每五个像素采集样品1回四个宏像素为11个字节,实际表示几个像素图像数据中YUV分量排列顺序如下:
U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y8
¨ Y211格式在档次方向上Y分量每一个像素采集样品3次,而UV分量每6个像素采集样品二遍1个宏像素为两个字节,实际表示五个像素图像数据中YUV分量排列顺序如下:
Y0 U0 Y2 V0 Y4 U4 Y6 V4
¨ YVU9格式为各种像素都提取Y分量,而在UV分量的领取时,首先将图像分成若干个4 x 4的宏块,然后每一种宏块提取叁个U分量和三个V分量图像数据存款和储蓄时,首先是整幅图像的Y分量数组,然后就跟着U分量数组,以及V分量数组IF09格式与YVU9好像
¨ IYUV格式为每种像素都提取Y分量,而在UV分量的领取时,首先将图像分成若干个2 x 2的宏块,然后每一个宏块提取二个U分量和一个V分量YV12格式与IYUV类似
¨ YUV411YUV420格式多见于DV数据中,前者用于NTSC制,后者用于PAL制YUV411为各类像素都提取Y分量,而UV分量在档次方向上每陆个像素采集样品三次YUV420并非V分量采集样品为0,而是跟YUV411相对而言,在档次方向上增强一倍色差采集样品频率,在笔直方向上以U/V间隔的章程减弱二分一色差采集样品,如下图所示

1. 游戏规则

「消灭星星」存在多少个版本,然而它们的规则除了「关卡分值」某个出入外,别的的平整都以如出一辙的。作者介绍的本子的游戏规则整理如下:

1. 色砖遍布

  • 10 x 10 的表格
  • 5种颜色 —— 红、绿、蓝,黄,紫
  • 每类色砖个数在钦定区间内随意
  • 5类色砖在 10 x 10 表格中私自分布

2. 革除规则

多个或多个以上同色砖块相连通就是可被铲除的砖块。

3. 分值规则

  • 排除总分值 = n * n * 5
  • 奖励总分值 = 两千 – n * n * 20

「n」表示砖块数量。上边是「总」分值的平整,还有「单」个砖块的分值规则:

  • 铲除砖块得分值 = 10 * i + 5
  • 剩余砖块扣分值 = 40 * i + 20

「i」表示砖块的索引值(从 0
开始)。简单地说,单个砖块「得分值」和「扣分值」是贰个等差数列。

4. 关卡分值

关卡分值 = 1000 + (level – 1) * 两千;「level」即当前关卡数。

5. 合格条件

  • 可解除色块不存在
  • 一共分值 >= 当前关卡分值

下边五个标准化还要创制游戏才方可过得去。

  • 不开源,当时使用的版本是破解版的,至于版权难点,此处就不切磋了;
  • 其相似只可以用于落到实处,假若落成产业化则有很多困难;
  • 程序运行比较慢;
  • 与别的语言结合有点小难题。
    当进入工作岗位之后,做的是大数额方向,接触了java与python后感觉到python对于做图像处理会特别好,所以这里不难的对python操作图像做一些简便的牵线。
变动色光属性

系统封装了三个类—ColorMatrix,通过这些类,能够很有益地经过转移矩阵值来处理颜色效果(色调、饱和度、亮度)。本质上是一个一维数组[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]。

图片 8

ColorMatrix

调剂色调(色彩的团团转运算):
  ColorMatrix类提供了setRotate(int axis, float
degrees)来调节颜色的色调。第②个参数,使用0、一 、2来表示Red、格林、Blue两种颜色的处理,第二个参数,就是亟需处理的值。

    /**
     * Set the rotation on a color axis by the specified values.
     * <p>
     * <code>axis=0</code> correspond to a rotation around the RED color
     * <code>axis=1</code> correspond to a rotation around the GREEN color
     * <code>axis=2</code> correspond to a rotation around the BLUE color
     * </p>
     */
    public void setRotate(int axis, float degrees) {
        reset();
        double radians = degrees * Math.PI / 180d;
        float cosine = (float) Math.cos(radians);
        float sine = (float) Math.sin(radians);
        switch (axis) {
        // Rotation around the red color
        case 0:
            mArray[6] = mArray[12] = cosine;
            mArray[7] = sine;
            mArray[11] = -sine;
            break;
        // Rotation around the green color
        case 1:
            mArray[0] = mArray[12] = cosine;
            mArray[2] = -sine;
            mArray[10] = sine;
            break;
        // Rotation around the blue color
        case 2:
            mArray[0] = mArray[6] = cosine;
            mArray[1] = sine;
            mArray[5] = -sine;
            break;
        default:
            throw new RuntimeException();
        }
    }

调剂饱和度
  通过色彩的位移运算单独增强奥迪Q5,G,B的饱和度,ColorMatrix类提供了setSaturation(float
sat)方法来全体调节图像的饱和度,参数代表设置颜色饱和度的值,当饱和度为0时,图像成为灰度图像,数值越大图像越饱和。

    /**
     * Set the matrix to affect the saturation of colors.
     *
     * @param sat A value of 0 maps the color to gray-scale. 1 is identity.
     */
    public void setSaturation(float sat) {
        reset();
        float[] m = mArray;

        final float invSat = 1 - sat;
        final float R = 0.213f * invSat;
        final float G = 0.715f * invSat;
        final float B = 0.072f * invSat;

        m[0] = R + sat; m[1] = G;       m[2] = B;
        m[5] = R;       m[6] = G + sat; m[7] = B;
        m[10] = R;      m[11] = G;      m[12] = B + sat;
    }

调剂亮度(色彩的缩放运算)
  当三原色以同等的百分比实行混合的时候,就会议及展览示出威尼斯绿,使用这一个规律来改变一个图像的亮度,亮度为0时,图像成为全黑。ColorMatrix类提供setScale(float
rScale, float gScale, float bScale, float
aScale)方法来调节颜色的亮度值。

    /**
     * Set this colormatrix to scale by the specified values.
     */
    public void setScale(float rScale, float gScale, float bScale,
                         float aScale) {
        final float[] a = mArray;

        for (int i = 19; i > 0; --i) {
            a[i] = 0;
        }
        a[0] = rScale;
        a[6] = gScale;
        a[12] = bScale;
        a[18] = aScale;
    }

2. MVC 设计方式

笔者这一次又是行使了 MVC
格局来写「消灭星星」。星星「砖块」的数据结构与各个气象由 Model
落成,游戏的骨干在 Model 中达成;View 映射 Model
的成形并做出相应的作为,它的天职重点是显得动画;用户与娱乐的互相由
Control 完成。

从逻辑规划上看,Model 很重而View 与 Control
很轻,但是,从代码量上看,View 很重而 Model 与 Control 相对很轻。

  1. 先是安装pytyhon,linux系统中
    已经本身带了python,至于在window系统只设置则越是简约,下载贰个Anaconda直接就足以安装了,后续的模块安装则直接动用pip安装会特别有益于。在此处就不一一讲述了。
部分常用的图像颜色处理矩阵
  • 灰度效果

图片 9

灰度矩阵

图片 10

灰度效果

  • 图像反转

图片 11

图像反转矩阵

图片 12

图像反转效果

  • 忆旧效果

图片 13

怀旧矩阵

图片 14

怀旧效果

  • 去色效果

图片 15

去色矩阵

图片 16

去色效果

3. Model

10 x 10 的表格用长度为 100 的数组可周全映射游戏的个别「砖块」。

[ R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G,
G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y,
Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R,
R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B,
B, Y, Y, P, P ]

1
2
3
4
5
6
7
8
9
10
11
12
[
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P
]

讴歌MDX – 黄褐,G – 古铜黑,B – 米黄,Y – 紫红,P – 珍珠白。Model
的中坚职分是以下五个:

  • 转变砖墙
  • 免去砖块 (生成砖块分值)
  • 狠抓砖墙
  • 破除残砖 (生成奖励分值)

图像打开与展示

from PIL import Image
import numpy as np
import scipy
import matplotlib.pyplot as plt
lena = Image.open('lena.jpg')           //打开图像  
print(lena.mode)                       //打印图像类型
print(lena.getpixel((0,0)))           //打印图像(0,0)处像素值
lena.show()                            //图像显示
像素点分析

能够经过变更各类像素点的现实A昂科雷GB值,来达到拍卖一张图像效果的指标。系统提供了Bitmap.getPixel()方法来博取某些像素点,也提供了Bitmap.getPixels()方法来提取整个Bitmap中的像素点,并保留到三个数组中:
getPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height)
当获得到具体的颜色值之后,就可以透过相应的算法来修改它的AEnclaveGB值,从而重构到一张新的图像。

常用图像像素点处理效果

—底片效果:

B.r = 255 - B.r; 
B.g = 255 - B.g; 
B.b = 255 - B.b;

图片 17

底片效果

—老照片效果:

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);

图片 18

老照片效果

—浮雕效果:

B.r = C.r - B.r + 127;
B.g = C.g - B.g + 127;
B.b = C.b - B.b + 127;

图片 19

浮雕效果

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图