图像处理基础


前言


一、图像的基本表示方法

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

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)

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值