• PIL


    1、颜色与RGBA值

    计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值。在Pillow中,RGBA的值表示为由4个整数组成的元组,分别是R、G、B、A。整数的范围0~255。RGB全0就可以表示黑色,全255代表黑色。可以猜测(255, 0, 0, 255)代表红色,因为R分量最大,G、B分量为0,所以呈现出来是红色。但是当alpha值为0时,无论是什么颜色,该颜色都不可见,可以理解为透明。

    2、图像的坐标

    图像中左上角是坐标原点(0, 0),这和平常数学里的坐标系不太一样。这样定义的坐标系意味着,X轴是从左到右增长的,而Y轴是从上到下增长。

    在Pillow中如何使用上述定义的坐标系表示一块矩形区域?许多函数或方法要求提供一个矩形元组参数。元组参数包含四个值,分别代表矩形四条边的距离X轴或者Y轴的距离。顺序是(左,顶,右,底)。右和底坐标稍微特殊,表示直到但不包括。可以理解为[左, 右)[顶, 底)这样左闭右开的区间。比如(3, 2, 8, 9)就表示了横坐标范围[3, 7];纵坐标范围[2, 8]的矩形区域。

    3、图像操作

    4、图像模式

    PIL中有九种不同模式。分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。

    4.1 模式“RGB”转换为其他不同模式

    示例:img_1 = img.convert("1")

    1、模式“1”

    模式“1”为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白。

    2、模式“L”

    模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:

    L = R * 299/1000 + G * 587/1000+ B * 114/1000

    3、模式“P”

    模式“P”为8位彩色图像,它的每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的。

    4、模式“RGBA”

    模式“RGBA”为32位彩色图像,它的每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道,即透明通道。

    5、模式“CMYK”

    模式“CMYK”为32位彩色图像,它的每个像素用32个bit表示。模式“CMYK”就是印刷四分色模式,它是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。

    四种标准颜色是:C:Cyan = 青色,又称为‘天蓝色’或是‘湛蓝’M:Magenta = 品红色,又称为‘洋红色’;Y:Yellow = 黄色;K:Key Plate(blacK) = 定位套版色(黑色)。

    “RGB”转换为“CMYK”的公式如下:

    C = 255 - R
    M = 255 - G
    Y = 255 - B

    6、模式“YCbCr”

    模式“YCbCr”为24位彩色图像,它的每个像素用24个bit表示。YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。

    模式“RGB”转换为“YCbCr”的公式如下:

    Y= 0.257*R+0.504*G+0.098*B+16
    Cb = -0.148*R-0.291*G+0.439*B+128
    Cr = 0.439*R-0.368*G-0.071*B+128

    7、模式“I”

    模式“I”为32位整型灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“I”模式是按照下面的公式转换的:

    I = R * 299/1000 + G * 587/1000 + B * 114/1000

    模式“I”与模式“L”的结果是完全一样,只是模式“L”的像素是8bit,而模式“I”的像素是32bit。

    8、模式“F”

    模式“F”为32位浮点灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“F”模式是按照下面的公式转换的:

    F = R * 299/1000+ G * 587/1000 + B * 114/1000

    4.2 其他不同模式转换为“RGB”模式

    模式“RGB”为24位彩色图像,它的每个像素用24个bit表示,分别表示红色、绿色和蓝色三个通道。

    在PIL中,对于彩色图像,open后都会转换为“RGB”模式,然后该模式可以转换为其他模式,比如“1”、“L”、“P”和“RGBA”,这几种模式也可以转换为“RGB”模式。

    示例:lena_1_rgb =lena_1.convert("RGB")

    1、 模式“1”转换为模式“RGB”

    模式“RGB”转换为模式“1”以后,像素点变成黑白两种点,要么是0,要么是255。而从模式“1”转换成“RGB”时,“RGB”的三个通道都是模式“1”的像素值的拷贝。

    2、 模式“L”转换为模式“RGB”

    模式“RGB”转换为模式“L”以后,像素值为[0,255]之间的某个数值。而从模式“L”转换成“RGB”时,“RGB”的三个通道都是模式“L”的像素值的拷贝。

    3、 模式“P”转换为模式“RGB”

    模式“RGB”转换为模式“P”以后,像素值为[0,255]之间的某个数值,但它为调色板的索引值,其最终还是彩色图像。从模式“P”转换成“RGB”时,“RGB”的三个通道会变成模式“P”的像素值索引的彩色值。

    4、 模式“RGBA”转换为模式“RGB”

    模式“RGB”转换为模式“RGBA”以后,图像从三通道变成了四通道,其R、G、B三个通道的数值没有变化,新增的alpha通道均为255,表示不透明。从模式“RGBA”转换成“RGB”时,“RGB”的三个通道又变回原来的数值。

    5、 模式“CMYK”转换为模式“RGB”

    模式“RGB”转换为模式“CMYK”以后,图像从三通道变成了四通道,其C、M、Y三个通道的数值是通过之前的公式计算得到,K通道被直接赋值为0。

    C = 255 - R
    M = 255 - G
    Y = 255 - B
    K = 0

    从模式“CMYK”转换成“RGB”时,“RGB”的三个通道又变回原来的数值,这是无损的转换。

    R = 255 - C
    G = 255 - M
    B = 255 - Y

    6、 模式“YCbCr”转换为模式“RGB”
    模式“RGB”转换为模式“YCbCr”,通常都是使用下面的公式计算,但PIL中并没有严格按照这个公式进行转换。
    Y= 0.257*R+0.564*G+0.098*B+16
    Cb = -0.148*R-0.291*G+0.439*B+128
    Cr = 0.439*R-0.368*G-0.071*B+128
    从模式“YCbCr”转换成“RGB”时,通常是按照下面的公式计算,但PIL中并没有严格按照这个公式进行转换。
    R= 1.164*(Y-16)+1.596*(Cr-128)
    G = 1.164*(Y-16)-0.392*(Cb-128)-0.813*(Cr-128)
    B = 1.164*(Y-16)+2.017*(Cb-128)

    7、 模式“I”转换为模式“RGB”

    模式“RGB”转换为模式“I”,将三通道变成了单通道,使用下面的公式计算获得像素值:

    I = R * 299/1000+ G * 587/1000 + B * 114/1000

    从模式“I”转换成“RGB”时,“RGB”的三个通道都是模式“I”的像素值的拷贝。

    8、 模式“F”转换为模式“RGB”

    模式“RGB”转换为模式“F”,将彩色图像变成了32位浮点灰色图像。在PIL中,从模式“RGB”转换为“F”模式是按照下面的公式转换的:

    F = R * 299/1000+ G * 587/1000 + B * 114/1000

    从模式“F”转换成“RGB”时,“RGB”的三个通道都是模式“F”的像素值整数部分的拷贝。

    4.3 带矩阵的模式转换

    im.convert(mode,matrix) ⇒ image

    这种定义只适合将一个“RGB”图像转换为“L”或者“RGB”图像,不能转换为其他模式的图像。变量matrix为4或者16元组。

    示例:

    rgb2xyz= (  
      
                 0.412453,0.357580, 0.180423, 0,  
      
                           0.212671,0.715160, 0.072169, 0,  
      
                           0.019334,0.119193, 0.950227, 0 )  
       
    lena_L = lena.convert("L", rgb2xyz)  
      
    lena_rgb = lena.convert("RGB", rgb2xyz)  
    

      

    5、滤波

    ImageFilter类中预定义了如下滤波方法:

    • BLUR:模糊滤波

    • CONTOUR:轮廓滤波

    • DETAIL:细节滤波

    • EDGE_ENHANCE:边界增强滤波

    • EDGE_ENHANCE_MORE:边界增强滤波(程度更深)

    • EMBOSS:浮雕滤波

    • FIND_EDGES:寻找边界滤波

    • SMOOTH:平滑滤波

    • SMOOTH_MORE:平滑滤波(程度更深)

    • SHARPEN:锐化滤波

    • GaussianBlur(radius=2):高斯模糊

    >radius指定平滑半径。

    • UnsharpMask(radius=2, percent=150, threshold=3):反锐化掩码滤波

    >radius指定模糊半径;

    >percent指定反锐化强度(百分比);

    >threshold控制被锐化的最小亮度变化。

    • Kernel(size, kernel, scale=None, offset=0):核滤波

    当前版本只支持核大小为3x3和5x5的核大小,且图像格式为“L”和“RGB”的图像。

    >size指定核大小(width, height);

    >kernel指定核权值的序列;

    >scale指定缩放因子;

    >offset指定偏移量,如果使用,则将该值加到缩放后的结果上。

    • RankFilter(size, rank):排序滤波

    >size指定滤波核的大小;

    >rank指定选取排在第rank位的像素,若大小为0,则为最小值滤波;若大小为size * size / 2则为中值滤波;若大小为size * size - 1则为最大值滤波。

    • MedianFilter(size=3):中值滤波

    >size指定核的大小

    • MinFilter(size=3):最小值滤波器

    >size指定核的大小

    • MaxFilter(size=3):最大值滤波器

    >size指定核的大小

    • ModeFilter(size=3):波形滤波器

    选取核内出现频次最高的像素值作为该点像素值,仅出现一次或两次的像素将被忽略,若没有像素出现两次以上,则保留原像素值。

    >size指定核的大小

    例:

    img_blur = img.filter(ImageFilter.BLUR)
    img_median = img.filter(ImageFilter.MedianFilter(5))

    6、注意事项

    save()可保存处理后的图片,如果未经处理,保存后的图像占用的空间(字节数)一般也与原图像不一样,可能经过了压缩。

  • 相关阅读:
    HDU4628+状态压缩DP
    Javascript 去掉字符串前后空格的五种方法
    Javascript 数组之判断取值和数组取值
    ASP.NET MVC 出现错误 “The view 'XXX' or its master was not found or no view engine support”
    ASP.NET MVC 页面调整并传递参数
    ASP.NET MV3 部署网站 报"Could not load file or assembly ' System.Web.Helpers “ 错的解决方法
    ASP.NET MVC 控制器向View传值的三种方法
    CSharp 如何通过拼接XML调用存储过程来查询数据
    SQLServer : EXEC和sp_executesql的区别
    关于SQLServer2005的学习笔记—异常捕获及处理
  • 原文地址:https://www.cnblogs.com/qjoanven/p/7676667.html
Copyright © 2020-2023  润新知