OpenCV入门——图像处理基础

图像处理基础

  • 表示方法
  1. 二值图像

  像素点包含“0”,“1”。仅仅包含黑色和白色。只使用一个比特位就能够表示。也仅仅只能表示黑色和白色两种颜色

    2.  灰度图像

  计算机会将灰度处理为256个灰度级即[0,255]。0为纯黑,255为纯白。需要使用8位二进制的值来表示。

    3. 彩色图像

  比前两者表现出更丰富的细节,人的视网膜存在三种不同的颜色感受器。能够感受红色,绿色,蓝色,就是三基色。这三种颜色构成最经典的色彩空间就是RGB色彩空间。RGB色彩空间中存在r红色通道,g绿色通道和b蓝色通道,一共三个通道,每个色彩通道值的范围都是在0到255之间。然后通过三个色彩通道的组合来形成各种颜色。可以把不同通道的数值大小理解成红绿蓝三种颜色按不同比例进行混合之后所得到的颜色。

但需要注意的是,opencv中通道的顺序为b,g,r。

在实际的图像处理过程中可以根据需要对图像的通道顺序进行转换。当然也可以根据需要对不同色彩空间的图像进行类型转换。

 

  • 像素处理
  1. 二值图像及灰度图像

  对于opencv中最小的数据类型是无符号的八位数。所以在opencv中是没有二值图像这种数据类型。二值图像通常是通过处理之后才得到的。用0表示黑色,用255表示白色。所以可以把二是图像理解为特殊的灰度图像。图像本质上就是矩阵这种数组的运算。呃灰度图像就可以看作是二维数组。

下面用一段程序来模拟二维数组创建一副黑色图像,并且对其进行访问和修改。

import cv2
import numpy as np
img=np.zeros((8,8),dtype=np.uint8)
print("img=\n",img)
cv2.imshow("one",img)
print("读取像素点img[0,3]=",img[0,3])
img[0,3]=255
print("修改后img=\n",img)
print("读取修改后像素点img[0,3]=",img[0,3])
cv2.imshow("two",img)
cv2.waitKey()
cv2.destroyAllWindows()

下面通过一段程序来读取一个灰度图像,然后对其中的像素进行访问和修改。

import cv2
img=cv2.imread("lena.bmp",0)
cv2.imshow("before",img)
for i in range(10,100):
    for j in range(80,100):
        img[i,j]=255
cv2.imshow("after",img)
cv2.waitKey()
cv2.destroyAllWindows()

我们可以看到,二维数组和图像之间存在着这种对应关系。

 

  1. 彩色图像

  rgb模式的彩色图像在读入opencv中处理时会按照行方向依次读取该rgb图像的b通道,g通道,r通道的像素点。图像的第一个索引表示行,第二个索引表示列,第三个索引表示颜色通道。

可以用Numpy生成一个三维数组,用来模拟bgr模式的彩色图像,然后对其像素进行访问和修改。

import numpy as np
import cv2
#-----------蓝色通道值--------------
blue=np.zeros((300,300,3),dtype=np.uint8)
blue[:,:,0]=255
print("blue=\n",blue)
cv2.imshow("blue",blue)
#-----------蓝色通道值--------------
green=np.zeros((300,300,3),dtype=np.uint8)
green[:,:,1]=255
print("green=\n",green)
cv2.imshow("green",green)
#-----------蓝色通道值--------------
red=np.zeros((300,300,3),dtype=np.uint8)
red[:,:,2]=255
print("red=\n",red)
cv2.imshow("red",red)
#-----------释放窗口--------------
cv2.waitKey()
cv2.destroyAllWindows()

读取彩色图像,并对像素进行修改访问。

import cv2
img=cv2.imread("lenacolor.png")
cv2.imshow("before",img)
print("访问img[0,0]=",img[0,0])
print("访问img[0,0,0]=",img[0,0,0])
print("访问img[0,0,1]=",img[0,0,1])
print("访问img[0,0,2]=",img[0,0,2])
print("访问img[50,0]=",img[50,0])
print("访问img[100,0]=",img[100,0])
#区域1
for i in range(0,50):
    for j in range(0,100):
        for k in range(0,3):
            img[i,j,k]=255  #白色
#区域2
for i in range(50,100):
    for j in range(0,100):
        img[i,j]=[128,128,128]  #灰色
#区域3
for i in range(100,150):
    for j in range(0,100):
        img[i,j]=0          #黑色
cv2.imshow("after",img)
print("修改后img[0,0]=",img[0,0])
print("修改后img[0,0,0]=",img[0,0,0])
print("修改后img[0,0,1]=",img[0,0,1])
print("修改后img[0,0,2]=",img[0,0,2])
print("修改后img[50,0]=",img[50,0])
print("修改后img[100,0]=",img[100,0])
cv2.waitKey()
cv2.destroyAllWindows()

  • 访问像素
  1. 二值图像及灰度图像
  2. 彩色图像

两者都是采用item函数获取相应元素,再用itemset设置对应位置上面的数值

语法格式为

灰度

item(行,列)

itemset((行,列),赋予的值)

彩色

item(行,列,通道)

itemset((行,列,通道),赋予的值)

import cv2
img=cv2.imread("lenacolor.png")
cv2.imshow("before",img)
print("访问img.item(0,0,0)=",img.item(0,0,0))
print("访问img.item(0,0,1)=",img.item(0,0,1))
print("访问img.item(0,0,2)=",img.item(0,0,2))
for i in range(0,50):
    for j in range(0,100):
        for k in range(0,3):
            img.itemset((i,j,k),255)     #白色
cv2.imshow("after",img)
print("修改后img.item(0,0,0)=",img.item(0,0,0))
print("修改后img.item(0,0,1)=",img.item(0,0,1))
print("修改后img.item(0,0,2)=",img.item(0,0,2))
cv2.waitKey()
cv2.destroyAllWindows()

此处仅展示彩色图像修改

  • 感兴趣区域ROI

  在实际的图像处理过程中,我们可能会对图像的某一特定区域感兴趣。可以被称为region of interest (ROI)我们可以对该区域进行整体的操作。比如可以进行复制,处理和修改。

import cv2
import numpy as np
a=cv2.imread("lenacolor.png",cv2.IMREAD_UNCHANGED)
cv2.imshow("original",a)
face=np.random.randint(0,256,(180,100,3))
a[220:400,250:350]=face
cv2.imshow("result",a)
cv2.waitKey()
cv2.destroyAllWindows()

对脸部打码

 

  • 通道操作

针对RGB图像,可以将其拆分为r,g,b3个通道。​共有两种方式,一种是使用索引,一种是使用相应的函数。
下面将通过几段程序来展现。​

#索引通道拆分
import cv2
lena=cv2.imread("lenacolor.png")
cv2.imshow("lena1",lena)
b=lena[:,:,0]
g=lena[:,:,1]
r=lena[:,:,2]
cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)
lena[:,:,0]=0
cv2.imshow("lenab0",lena)
lena[:,:,1]=0
cv2.imshow("lenab0g0",lena)
cv2.waitKey()
cv2.destroyAllWindows()

#函数拆分
import cv2
lena=cv2.imread("lenacolor.png")
b,g,r=cv2.split(lena)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey()
cv2.destroyAllWindows()


#合并

import cv2
lena=cv2.imread("lenacolor.png")
b,g,r=cv2.split(lena)
bgr=cv2.merge([b,g,r])
rgb=cv2.merge([r,g,b])
cv2.imshow("lena",lena)
cv2.imshow("bgr",bgr)
cv2.imshow("rgb",rgb)
cv2.waitKey()
cv2.destroyAllWindows()
  • 获取属性

包括行数,列数,通道数,像素数等

import cv2
gray=cv2.imread("lena.bmp",0)
color=cv2.imread("lenacolor.png")
print("图像gray属性:")
print("gray.shape=",gray.shape)
print("gray.size=",gray.size)
print("gray.dtype=",gray.dtype)
print("图像color属性:")
print("color.shape=",color.shape)
print("color.size=",color.size)
print("color.dtype=",color.dtype)

 

                                                                                                                                                                                                                              如果有什么疑问,欢迎在评论区或私信讨论呦(*^_^*)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值