图像的基础操作

1 图像的基础操作

目标
• 获取像素值并修改
• 获取图像的属性(信息)
• 图像的 ROI()
• 图像通道的拆分及合并
几乎所有这些操作与 Numpy 的关系都比与 OpenCV 的关系更加紧密,因此熟练 Numpy 可以帮助我们写出性能更好的代码。
(示例将会在 Python 终端中展示,因为他们大部分都只有一行代码)

1.1 获取并修改像素值

处理灰度图像的实例:指定位置的像素都是一个数值
[1]读取像素
图像名[横坐标,纵坐标]
[2]修改像素
图像名[横坐标,纵坐标]=新值
import cv2
#请确保当前目录下有(灰度图像lena256.bmp)
i=cv2.imread("..\\image\\lena256.bmp",cv2.IMREAD_UNCHANGED)
#IMREAD_UNCHANGED指的是按照图片原来的样式读进来
# 写法一:
"""
print(i[100,100])       #输出100,100位置的值
i[100,100]=255          #将100,100位置的值改变
print(i[100,100])       #再次输出100,100位置的值
"""
# 写法二:
"""
p=i[100,100]
print(p)
i[100,100]=255
p=i[100,100]
print(p)
"""
处理彩色图像的实例:指定位置的像素都是一个三位数的元组
[1]读取像素
图像名[横坐标,纵坐标]-->BGR三值
图像名[横坐标,纵坐标,通道]-->单值
[2]修改像素
图像名[横坐标,纵坐标]=[B,G,R]
图像名[横坐标,纵坐标,通道]=单值
i[100,100]的值是[78 68 178]:第100行100列位置的BGR三值
i[100,100,0]的值是78: 第100行100列B通道的单值
i[100,100,1]的值是68: 第100行100列G通道的单值
i[100,100,2]的值是178:第100行100列R通道的单值
import cv2
#请确保在指定目录下有彩色图像文件
i=cv2.imread("..\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)
#IMREAD_UNCHANGED指的是按照图片原来的样式读进来

"""
分别更改三个通道
"""
# print(i[100,100])
# i[100,100,0]=255            #更改通道B的值
# print(i[100,100])
# i[100,100,1]=255            #更改通道B的值
# print(i[100,100])
# i[100,100,2]=255            #更改通道B的值
# print(i[100,100])

'''
同时更改三个通道
'''
# print(i[100,100])
# i[100,100]=[255,255,255]
# print(i[100,100])


'''
更改一个像素块(区域)
'''
cv2.imshow("original",i)
i[100:150,100:150]=[0,0,255]        #将指定区域显示为制定的BGR三颜色
cv2.imshow("result",i)
cv2.waitKey(0)
cv2.destroyAllWindows()

对于获取每一个像素值,也许使用 Numpy 的 array.item() 和 array.itemset() 会更好。但是返回值是标量。如果你想获得所有 B,G,R 的值,你需要使用 array.item() 分割他们。

使用numpy处理像素

[1]读取像素
图像名.item(位置参数)
[2]修改像素
图像名.itemset(位置,新值)
import cv2
import numpy as np
"""
处理灰度图像
"""
# i=cv2.imread("..\\image\\lena256.bmp",cv2.IMREAD_UNCHANGED)
# print(i.item(100,100))              #打印原始的值
# i.itemset((100,100),100)            #设置灰度图像为新值
# print(i.item(100,100))              #打印改后的值


"""
处理彩色图像
"""
i=cv2.imread("..\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)
print(i.item(100,100,0))        #打印原始的值
i.itemset((100,100,0),255)      #设置BGR图像0通道的新值
print(i.item(100,100,0))        #打印改后的值

print(i.item(100,100,1))
i.itemset((100,100,1),255)
print(i.item(100,100,1))

print(i.item(100,100,2))
i.itemset((100,100,2),255)
print(i.item(100,100,2))

1.2 获取图像属性

图像的属性包括:行,列,通道,图像数据类型,像素数目等

img.shape 可以获取图像的形状。他的返回值是一个包含行数,列数,通道数的元组

img.size    可以返回图像的像素数目

img.dtype 返回的是图像的数据类型

import cv2
a=cv2.imread("..\\image\\lena256.bmp",cv2.IMREAD_UNCHANGED)      #灰度图像
b=cv2.imread("..\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)    #彩色图像
print(a.shape)
print(b.shape)
print(a.size)
print(b.size)
print(a.dtype)
print(b.dtype)

 输出:

(256, 256)
(512, 512, 3)
65536
786432
uint8
uint8

1.3 图像 ROI

有时你需要对一幅图像的特定区域进行操作。例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜索。这样会提高程序的准确性和性能。ROI 也是使用 Numpy 索引来获得的。现在我们选择球的部分并把他拷贝到图像的其他区域。

ROI——显示面部

import cv2
import numpy as np
a=cv2.imread("..\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)
face=np.ones((101,101,3))       #定义一个大小101*101,通道数=3的图像
cv2.imshow("original",a)
face=a[220:400,250:350]         #将感兴趣的区域赋值给定义的face(保证图像大小相等)
cv2.imshow("face",face)
cv2.waitKey()                   #这句话是要等待,这句话之前的都能执行,这句话之后的都不执行
cv2.destroyAllWindows()

ROI——复制面部到本图片

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

ROI——复制面部到其他图片 

import cv2
import numpy as np
a=cv2.imread("..\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)     #读入第一张图像
b=cv2.imread("..\\image\\girl.bmp",cv2.IMREAD_UNCHANGED)          #读入第二张图像
face=np.ones((101,101,3))                                         #定义感兴趣ori区域
cv2.imshow("originalA",a)
cv2.imshow("originalB",b)
face=a[220:400,250:350]                                           #将图像1复制给ori区
b[0:180,0:100]=face                                               #将ori区复制给图像2的左上方
cv2.imshow("result",b)
cv2.waitKey()
cv2.destroyAllWindows()

ROI——感兴趣区域复制到其他图片 

import cv2
import numpy as np
a=cv2.imread("..\\image\\lenacolor.png")
girl=cv2.imread("..\\image\\girl.bmp")
b=np.ones((101,101,3))
b=a[220:400,250:350]
girl[180:360,200:300]=b
cv2.imshow("original",girl)

cv2.waitKey()
cv2.destroyAllWindows()
 

1.4 拆分及合并图像通道

有时我们需要对 BGR 三个通道分别进行操作。这是你就需要把 BGR 拆分成单个通道。有时你需要把独立通道的图片合并成一个 BGR 图像。你可以这样做:

import cv2
import numpy as np
a=cv2.imread("..\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)
b,g,r=cv2.split(a)              #拆分成三个灰度图像
cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)
bgr=cv2.merge([b,g,r])          #将三个灰度图像合并(bgr顺序)
rgb=cv2.merge([r,g,b])          #将三个灰度图像合并(rgb顺序)
cv2.imshow("bgr",bgr)
cv2.imshow("rgb",rgb)
cv2.waitKey()
cv2.destroyAllWindows()

提取固定通道颜色

#【提取蓝色通道图像】
import cv2
import numpy as np
a=cv2.imread("..\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)
rows,cols,chn=a.shape                           #得到a的形状属性shape(行数、列数、通道数)
b=cv2.split(a)[0]
g = np.zeros((rows,cols),dtype=a.dtype)
r = np.zeros((rows,cols),dtype=a.dtype)
m=cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey()
cv2.destroyAllWindows()


#【提取绿色通道图像】
# import cv2
# import numpy as np
# img = cv2.imread("..\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)
# rows,cols,chns=img.shape
# print(rows,cols,chns)
# g = cv2.split(img)[1]
# b = np.zeros((rows,cols),dtype=img.dtype)
# r = np.zeros((rows,cols),dtype=img.dtype)
# merge=cv2.merge([b,g,r])
# cv2.imshow("merge_b",merge)
# cv2.waitKey()
# cv2.destroyAllWindows()


#【提取红色通道图像】
# import cv2
# import numpy as np
# img=cv2.imread("..\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)
# rows,cols,chns=img.shape
# g=cv2.split(img)[1]
# b=np.zeros([rows,cols],dtype=img.dtype)
# r=np.zeros([rows,cols],dtype=img.dtype)
# merge=cv2.merge([b,g,r])
# cv2.imshow("merge_g",merge)
# cv2.waitKey()
# cv2.destroyAllWindows()

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值