图像处理基础

    科技2022-07-10  112

    文章目录

    前言一、图像的基本表示方法1.二值图像2.灰度图像3.彩色图像 二、像素处理1.二值图像及灰度图像2.彩色图像 三.使用numpy.array访问像素1.二值图像及灰度图2.彩色图像 四.感兴趣区域(1)(2)或者对于某幅图像,需要仅仅显示其某个部分,也可以采取类似操作:(3)对上述图片人物进行打码 五.通道操作1.通过索引来拆分2.调用函数来拆分3.通道合并 六.获取图像的相关属性1.大小:shape2.size3.dtype


    前言


    一、图像的基本表示方法

    这里主要讨论二值图像,灰度图像,彩色图像的基本表示方法。

    1.二值图像

    二值图像是指仅仅包含黑色和白色两种颜色的图像。在计算机中,图像是以矩阵的形式存在,矩阵中的每一个元素代表一个像素点,在二值图像中,计算机将白色像素点处理为‘1’,将黑色像素点处理为‘0’,其灰度值用1个bit就可以表示。

    2.灰度图像

    计算机通常用8bit来表示灰度值,灰度级通常为0~255,黑色灰度值为0,白色灰度值为255,灰度图像中不仅含有黑白两种颜色像素点,介于两者之间还存在一些其他的灰度颜色。

    3.彩色图像

    彩色图像是更常见的一类图像,它使用三通道来表示不同的颜色,通常为R,G,B三通道,但在Opencv中为B(blue),G(green),R(red)三通道每一个通道的灰度值都介于0~255之间,通过三通道不同灰度值混合,可以得到各种颜色。 在计算机中通常用三维数组来表示彩色图像。

    二、像素处理

    1.二值图像及灰度图像

    在opencv中没有二值图像这种数据类型,通常我们通过阈值处理得到二值图像,使用0表示黑色,255表示白色。

    灰度图像在opencv中以二维数组的形式表示,数据类型为numpy.ndarray,所以我们可以借助numpy库来对图像相应的像素点进行处理。 例如我们可以通过numpy创建数组构成特殊图像:

    import cv2 import numpy as np black=np.zeros((200,200),dtype=np.uint8)#元素全0 white=black+255#元素全255 cv2.imshow("white",white) cv2.imshow("black",black) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果显示: 也可以通过修改原图像对应位置值对图像进行修改:

    import cv2 import numpy as np image=cv2.imread("color_2.png",cv2.IMREAD_GRAYSCALE)#读取灰度图 before=image.copy()#保存修改前数据 #修改第10~100行,20~60列 for i in range(10,100): for j in range(20,60): image[i,j]=0 cv2.imshow("before",before) cv2.imshow("after",image) cv2.waitKey(0) cv2.destroyAllWindows() image.shape

    运行结果显示:

    2.彩色图像

    在opencv中彩色图像以三维数组形式表示,第一维度为长,第二维度为宽,第三维度为B,G,R三通道。

    import cv2 import numpy as np image=np.zeros((200,200,3),dtype=np.uint8)#元素全0,三维数组 blue=image.copy() green=image.copy() red=image.copy() blue[:,:,0]=255 green[:,:,1]=255 red[:,:,2]=255 cv2.imshow("blue",blue) cv2.imshow("green",green) cv2.imshow("red",red) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果:

    三.使用numpy.array访问像素

    numpy.array 提供了item()与itemset()函数来访问和修改像素值,使用这两种函数比使用索引要更便捷。

    1.二值图像及灰度图

    函数item()可以高效访问图像像素点,其用法:

    item(行,列)

    函数itemset()可以用来修改像素值,其用法:

    itemset(索引值,新值) import numpy as np arr=np.arange(0,9).reshape(3,3) print(arr) print(arr.item(2,2)) arr.itemset((2,2),1000) print(arr)

    运行结果:

    2.彩色图像

    item()与itemset()访问和修改彩色图像,用法与灰度图一致,只是索引需再添加一个维度。

    四.感兴趣区域

    在数字图像处理的过程中,可能需要对图像的某个特定区域进行相关操作,这个区域就是感兴趣区域。我们此时可以借助numpy中切片对感兴趣的整块区域进行操作。

    (1)

    import numpy as np image=np.zeros((400,400),dtype=np.uint8) image[100:150,100:150]=255 cv2.imshow("before",image) #将图像中白色区域赋值 image[100:150,250:300]=255 cv2.imshow("after",image) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果:

    (2)或者对于某幅图像,需要仅仅显示其某个部分,也可以采取类似操作:

    import cv2 import numpy as np image=cv2.imread("color_2.png") cv2.imshow("image",image) after=image[250:420,250:450] cv2.imshow("after",after) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果:

    (3)对上述图片人物进行打码

    import cv2 import numpy as np image=cv2.imread("color_2.png") cv2.imshow("image",image) face=np.random.randint(0,256,(170,200,3)) image[250:420,250:450]=face cv2.imshow("after",image) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果:

    五.通道操作

    彩色图像由B,G,R三通道组成,我们可以对图像进行通道的拆分和合并。 我们可以通过索引来提取图像各通道的信息,也可以调用opencv API函数来进行操作。

    1.通过索引来拆分

    import cv2 import numpy as np import matplotlib.pyplot as plt image=cv2.imread("color_2.png") #matplotlib中彩色图像为R,G,B new=image.copy() new[:,:,0]=image[:,:,2] new[:,:,2]=image[:,:,0] #分离通道 b=image[:,:,0] g=image[:,:,1] r=image[:,:,2] #只保留R通道 new1=new.copy() new1[:,:,1]=0 new1[:,:,2]=0 #只保留G通道 new2=new.copy() new2[:,:,0]=0 new2[:,:,2]=0 #只保留B通道 new3=new.copy() new3[:,:,0]=0 new3[:,:,1]=0 plt.subplot(2,4,1),plt.imshow(new),plt.title("original") plt.subplot(2,4,2),plt.imshow(b),plt.title("B") plt.subplot(2,4,3),plt.imshow(g),plt.title("G") plt.subplot(2,4,4),plt.imshow(r),plt.title("R") plt.subplot(2,4,5),plt.imshow(new1),plt.title("Only R") plt.subplot(2,4,6),plt.imshow(new2),plt.title("Only G") plt.subplot(2,4,7),plt.imshow(new3),plt.title("Only B")

    运行结果:

    2.调用函数来拆分

    b,g,r=cv2.split(image) #b,g,r为三通道;image为要分离的图像

    3.通道合并

    可以通过切片对像素进行重组,也可以调用如下函数进行通道合并。

    cv2.merge([b,g,r]) #只有一个参数,以列表或元组的形式传入b,g,r的值

    六.获取图像的相关属性

    属性包括图像的大小,类型等。

    1.大小:shape

    返回图像数组的形状,如果为灰度图,返回(行,列);如果为彩色图,返回(行,列,通道数);

    2.size

    返回图像数组元素个数,即原始图像像素点的个数。

    3.dtype

    返回图像数组元素的数据类型

    import cv2 import numpy as np #读入一幅彩色图 image=cv2.imread("color_2.png") print("shape",image.shape) print("size",image.size) print("type",image.dtype)

    运行结果:

    Processed: 0.018, SQL: 8