图像的基础操作

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

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()

 

 

 

 

今天的文章图像的基础操作分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31458.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注