灰度:使用黑色调表示物体,黑色为基准色,用不同的饱和度的黑色来显示图像。
- 二值图像:只有黑和白两种颜色。0表示黑,255表示白;R/G/B = 0/255;
- 灰度图像:在黑色与白色之间还有许多级的颜色深度;R=G=B;
- 彩色图像:每个像素通常由RGB三个分量来表示。分别介于(0,155)
1.1 读入图像
import cv2
img = cv2.imread("/Users/~/image.png, 1)
1.2 通过行或列的坐标获取像素值。
px = img[100, 100]
print(px)
blue = img[100, 100, 0]
print(blue)
#out
[111 108 97]
111
1.3 修改像素值
img[100, 100] = [255, 255, 255]
print(img[100, 100])
#out
[255, 255, 255]
1.4 获取像素及修改更好的方法
print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))
#out
120
100
获取图像的行、列、通道、数据类型、像素数目等
import cv2
img = cv2.imread("/Users/~/image.png, 0)
#行、列、通道
print(img.shape)
#out
(848, 1534)#灰度图
#像素数目
print(img.size)
#out
1300832
#图像的数据类型
print(img.dtype)
#out
uint8
有时需要对一副图像的特定区域进行操作。例:检测一副图像中的眼睛,我们应先找到脸,再从脸中找到眼睛;而不是直接去找眼睛
import cv2
img = cv2.imread("/Users/~/image.png, 0)
face = img[280:340, 330:390]
eye = img[273:333, 100:160]
4.1 、拆分合并图像通道
import cv2
img = cv2.imread("/Users/~/image.png)
b, g, r = cv2.split(img)#比较耗时
img = cv2.merge((b, g, r))
4.2 指定渠道赋值
#取红色通道的值
r = img[:,:,0]#速度较快
#红色通道值赋0
img[:,:,0] = 0
为图像加个边框:cv2.copyMakeBorder().
参数说明:
import cv2
import numpy as np
from matplotlib import pyplot as plt
blue = [255, 0, 0]
replicate = cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_CONSTANT,value=blue)
plt.subplot(231),plt.imshow(image1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()
OpenCV画图的颜色顺序是:BGR
matplotlib画图的顺序是:RGB
cv2.add():两幅图像的大小,类型必须一致,或者第二个图像可以是一个简单的标量值。
x = np.uint8([250])
y = np.unit8([10])
print(cv2.add(x, y))#250 + 10 = 260 >= 255
#out
[[255]]
print(x+y)# 250+10 = 260%255 = 4
#out
[4]
OpenCV效果会更好一些,尽量用OpenCV中的函数。
cv2.addWeighted():其实也是加法,但是混合图像的权重不同,图像混合的计算公式如下:
g ( x ) = ( 1 − a ) f 0 ( x ) + a f 1 ( x ) g(x) = (1-a)f_{0}(x)+af_{1}(x) g(x)=(1−a)f0(x)+af1(x)
通过修改a的值,实现不同的混合。
import cv2
from matplotlib import pyplot as plt
img0 = cv2.imread("/Users/~~~/cat.jpg")
#合并的两幅图大小应一致,将cat的大小转换成logo的大小。
img1 = img0[100:596, 100:500]
cv2.imshow('cat', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(img1.shape)
img2 = cv2.imread("/Users/~~~/logo.jpg")
cv2.imshow('logo', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(img2.shape)
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('merge', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
#加载图像
img1 = cv2.imread("/Users/~~~/cat.jpg")
img2 = cv2.imread("/Users/~~~/logo.jpg")
#将img2放在img1的左上角,所以创建roi
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
#创建图像的掩码和逆掩码
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
#img2gray中>175的值均变成255
ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)
#按位非操作
mask_inv = cv2.bitwise_not(mask)
#取roi中于mask中不为零的值对应的像素的值,其他值为0
img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
#取roi中于mask_inv中不为零的值对应的像素的值,其他值为0
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)
#put logo in ROI and modify the main image
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('res', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()