对图像的基础操作
1.修改像素值
import cv2
import numpy as np
img=cv2.imread("test1.jpg")
img[100,100]=[255,255,255]
print (img[100,100])
类似于矩阵中数据替换,但是这种方式很慢,能矩阵运算就不用循环。
用.itemset ()函数来修改
import cv2
import numpy as np
img=cv2.imread("test1.jpg")
print(img[100,100])
print(img.item(100,100,2))
img.itemset((100,100,2),100)
print(img.item(100,100,2))
2.获取图像属性
img.shape()能返回:行、列、通道数
import cv2
import numpy as np
img=cv2.imread("test1.jpg")
print(img.shape)
img.size()能返回图像的像素数目
import cv2
import numpy as np
img=cv2.imread("test1.jpg")
print(img.size)
img.dtype()能返回图像 的数据类型
import cv2
import numpy as np
img=cv2.imread("test1.jpg")
print(img.dtype)
3.直接像素点和ROI(region of interest)
之前修改像素点都是用数组方法,一个个循环去修改,而这里选择用切片的方法把图像某块区域,提取出来,再对原始图像进行改动。
import cv2
import numpy as np
img=cv2.imread("1.jpg",0)
part=img[:160,:174]
img[160:,160:]=part
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.拆分合并通道
BGR三个通道可以拆开也可以合并
import cv2
import numpy as np
img=cv2.imread("test1.jpg")
b,g,r=cv2.split(img)
cv2.imshow("Red", r)
cv2.imshow("Green", g)
cv2.imshow("Blue", b)
cv2.waitKey(0)
cv2.merge()#通道合并
5.图像边界填充
import cv2
import numpy
img=cv2.imread('11.jpg')
img=cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_CONSTANT,value=(255,255,255))
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.copyMakeBorder(src,top,bottom,left,right,borderType)
src : 输入的图片
top, bottom, left, right :相应方向上的边框宽度
borderType:定义要添加边框的类型,它可以是以下的一种:
cv2.BORDER_CONSTANT:添加的边界框像素值为常数(需要额外再给定一个参数)
cv2.BORDER_REFLECT:添加的边框像素将是边界元素的镜面反射,类似于gfedcba|abcdefgh|hgfedcba
cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT:和上面类似,但是有一些细微的不同,类似于gfedcb|abcdefgh|gfedcba
cv2.BORDER_REPLICATE:使用最边界的像素值代替,类似于aaaaaa|abcdefgh|hhhhhhh
cv2.BORDER_WRAP:上边缘的元素放到下边缘复制cdefgh|abcdefgh|abcdefg
value:如果borderType为cv2.BORDER_CONSTANT时需要填充的常数值。
6.算术操作
1.图像加法
(相加的照片大小一定要相等)
cv2.add(img1,img2)(无权)
img1:被加数
img2:加数,可以是简单的标量
PS:Opencv 和 Numpy中的加法不一样,在超过像素上限255的情况下,就会有溢出问题。
Opencv采取饱和操作,当值超过255后直接取255
Numpy会取余,如:(250+10)%255=5,最后取得的值是5
所以图像操作中更倾向于使用cv的库
cv2.addWeighted(src1,alpha,src2,beta,gamma)(加权)
src1:第一幅图片
alpha:第一幅权重
src2:第二幅图片
beta:第二幅权重
gamma:附加常数
i
m
g
=
i
m
g
1
∗
a
l
p
h
a
+
i
m
g
2
∗
b
e
t
a
+
g
a
m
m
a
img=img1*alpha+img2*beta+gamma
img=img1∗alpha+img2∗beta+gamma
2.图像逻辑运算
1.掩膜(mask)
用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
- 提取感兴趣区:用预先制作的感兴趣区掩膜与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0;
- 屏蔽作用:用掩膜对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计;
- 结构特征提取:用相似性变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征;
- 特殊形状图像的制作。
原图像的像素矩阵为
[
1
2
3
4
5
6
7
8
9
]
\left[ \begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{matrix} \right]
147258369
掩膜的矩阵为
[
1
0
1
0
0
1
1
0
0
]
\left[ \begin{matrix} 1 & 0& 1\\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{matrix} \right]
101000110
掩膜对原图像的像素进行覆盖(与)操作
[
1
0
3
0
0
6
7
0
0
]
\left[ \begin{matrix} 1 & 0 & 3 \\ 0 & 0 & 6 \\ 7 & 0 & 0 \end{matrix} \right]
107000360
只留下想要的部分
掩膜主要用于运用在颜色追踪上(选定追踪颜色后,追踪指定颜色物品运动)
2. 逻辑运算
cv2.bitwise_not(img,mask=None)#按位取反
cv2.bitwise_and(img1,img2,mask=None)#按位与
cv2.bitwise_or(img1,img2,mask=None)#按位取或
cv2.bitwise_xor(img1,img2,mask=None)#按位取异或
mask:具体操作时的掩膜,没有就None
AND:两个像素都大于0时为真
OR:两个像素有一个大于0就为真
XOR:如两个值不相同,则异或结果为1。如果两个值相同,异或结果为0。
NOT:10,01
标签:img,cv2,second,step,图像,import,100,cv,255 From: https://blog.csdn.net/m0_51634066/article/details/142564322