opencv的图像处理基础

一:图像的基本表示方法

1:二值图像
图像中只包含黑色和白色两种颜色,计算机将其处理为1/0以方便后续的存储和处理等操作(1bit位即可表示)

2:灰度图像
二值图像因仅有黑白二色,所表示的图像不够细腻,而灰度图像采用更多的数值以体现不同的颜色,故细节更丰富。
计算机通常将灰度处理为256个灰度级(8bit,正好一个字节),用数值区间[0,255]来表示,其中255表示纯白,0表示纯黑,其余数值表示不同程度的灰度。
有时也会使用8位二进制(1个字节)来表示一幅二值图像,此时使用255表示白色,0表示黑色(有且只有0和255两个灰度值(灰度级),不存在其他灰度值的像素点)

3:彩色图像
相比二值图像以及灰度图像,彩色图像是一类更常见的图像,它能体现更丰富的细节信息。虽然在各个领域彩色图像的表示方式不同(如RGB、HSV等),但它们都能通过一定的公式进行转化,在此只讨论RGB色彩空间。

二:像素处理

1:二值图像与灰度图像(二值图是一种特殊的灰度图)

注:在opencv中,最小的数据类型为无符号的8位数,因此在opencv中实际并没有二值图像这种类型,二值图像通常是经过处理得到的,然后使用0表示黑色,255表示白色

img=cv2.imread("1.jpg",0)#以灰度图读入
cv2.imshow("before",img)
for i in range(10,100):
	for j in range(50,150):
		img[i,j]=255#修改灰度图像上第i行第j列的像素值为255(白色)
cv2.imshow("after",img)
cv2.waitKey()
cv2.destroyAllWindows()

2:彩色图像
RGB模式的图像在opencv读入时,会依次读取该图像的B,G,R通道上的像素点,并将像素以行为单位存储在ndarray的列中,即一幅H行,W列的RGB图像在opencv中以BGR模式的三维数组形式存储([[[B,G,R],[B,G,R],[B,G,R]]]表示1行3列的RGB图像)(如image[1,2,0]表示图像第一行(H)第二列(w)的B通道上的像素值)

img=np.zeros((300,300,3),np.uint8)
img[:,0:100,0]=255#第0~100列显示蓝色
img[:,100:200,1]=255#第100~200列显示绿色
img[:,200:300,2]=255#第200~300列显示红色
cv2.imshow("img",img)
cv2.waitKey()

三:numpy.array访问像素

numpy.array提供了item()和itemset()函数来访问和修改像素值,这两个函数都是经过优化处理的,能够大幅度提升效率,在访问及修改像素值时,利用numpy.array提供的函数比直接使用索引要快得多,同时这两个函数的可读性也更好。(即img.item(100,250)比img[100,250]读取图片第100行250列上的像素要来得快)

img=cv2.imread("1.ppg")
print("读取像素点img.item(50,100,1)=",img.item(50,100,1))
cv2.imshow("before",img)
for i in range(50,200):
	for j in range(100,300):
		for k in range(3):
		img.itemset((i,j,k),2545)
cv2.imshow("after",img)
cv2.waitKey()

四:感兴趣区域(ROI)

在图像处理过程中,我们对图像的某一区域感兴趣,该区域则被称为感兴趣区域(Region of Intersr,ROI),在设定感兴趣区域ROI后,我们就可对该区域进行处理。

img1=cv2.imread("1.jpg",-1)#原格式读取图像
img2=cv2.imread("2.jpg",-1)

cv2.imshow("img1",img1)
cv2.imshow("mg2",img2)

random_img=np.random.randint(0,256,(100,100,3))
img1[100:200,200:300]=random_img#对img1的感兴趣区域进行马赛克
cv2.imshow("img1",img1)

ROI=img1[300:400,300:400]
img2[400:500,300:400]=ROI#用img1的感兴趣区域覆盖到img2的感兴趣区域上
cv2.imshow("img2",img2)
cv2.waitKey()

五:通道操作

1:通道拆分

如:img为RGB三维图像
			b=img[:,:,0]
			r=img[:,:,1]
			r=img[:,:,2]
			或者b,g,r=cv2.split(img)

2:通道合并

img=cv2.imread("img/1.jpg")
b,g,r=cv2.split(img)
bgr=cv2.merge([b,g,r])#与原图一致,仔细想一下就知道了,在存储时是以B,G,R的顺
序存储的数组,要得到与原图一致的图像,则也需要按数组顺序进行合并
rgb=cv2.merge([r,g,b])
cv2.imshow("img",img)
cv2.imshow("bgr",bgr)
cv2.imshow("rgb",rgb)
cv2.waitKey()

六:图像属性

1:img.shape,返回行(H)、列(W)、通道数©(彩色图像,不为灰度图或者二值图)
2:img.size,返回像素数目(HWC),灰度图或者二值图C=1
3:img.dtype,返回图像的数据类型

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值