图像基本操作
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
#图片显示
def cv_show(name,image):
cv.imshow(name, image)
cv.waitKey(0)
cv.destroyAllWindows()
#通道提取与合并
def channels():
if judge==1:
image=cv.imread("cat.jpg")
b, g, r = cv.split(image)
else:
image=cv.merge(b,g,r)
#图片基本操作
def picture_work():
src = cv.imread("cat.jpg")
cv_show("new", src)
img = cv.imread("cat.jpg", cv.IMREAD_GRAYSCALE) ##处理成灰度
cv_show("one", img)
cv.imwrite("one.jpg", img)
#视频播放
def video_work():
#capture=cv.VideoCapture("test.mp4")
capture=cv.VideoCapture(0)
if capture.isOpened():
open=True
else:
open=False
while open:
ret, frame = capture.read() #frame是视频中每一帧
if frame is None:
break
if ret == True:
gray=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
cv.imshow("video", frame)
cv.imshow("video Q", gray)
c = cv.waitKey(50) #停留50毫秒
if c == 27:
break
#图片裁剪
def picture_cut():
img = cv.imread('cat.jpg')
cat = img[0:200, 0:200]
cv_show('cat', cat)
#边界填充
def border_fill():
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
img=cv.imread("cat.jpg")
replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv.BORDER_REPLICATE)
reflect = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT)
reflect101 = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT_101)
wrap = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_WRAP)
constant = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_CONSTANT, value=0)
plt.subplot(231), plt.imshow(img, '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()
#图像融合
def picture_mix():
dog=cv.imread("dog.jpg")
cat=cv.imread("cat.jpg")
dog=cv.resize(dog,(500,414))
#ps:cv.resize用法2:cv.resize(dog,(0,0).fx=3,fy=1) #x方向扩大3倍,y方向扩大1倍
mix=cv.addWeighted(dog,0.6,cat,0.4,0)
cv_show("new",mix)
if __name__=="__main__":
#picture_work()
#video_work()
#picture_cut()
# border_fill()
# cat = cv.imread("cat.jpg")
# print(cat.shape)
picture_mix()
waitKey() | 画面停留时间 。0:任意键退出; 其他数值:毫秒后退出 |
cv2.IMREAD_COLOR | 彩色图像 |
cv2.IMREAD_GRAYSCALE | 灰度图像 |
边界填充 | |
---|---|
BORDER_REPLICATE | 复制法,也就是复制最边缘像素。 |
BORDER_REFLECT | 反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba |
BORDER_REFLECT_101 | 反射法,也就是以最边缘像素为轴,对称,gfedcb |
BORDER_WRAP | 外包装法cdefgh |
BORDER_CONSTANT | 常量法,常数值填充。 |
图像阈值 | |
---|---|
src | 输入图,只能输入单通道图像,通常来说为灰度图 |
dst | 输出图 |
thresh | 阈值 |
maxval | 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值 |
cv2.THRESH_BINARY | 超过阈值部分取maxval(最大值),否则取0 |
cv2.THRESH_BINARY_INV | THRESH_BINARY的反转 |
cv2.THRESH_TRUNC | 大于阈值部分设为阈值,否则不变 |
cv2.THRESH_TOZERO | 大于阈值部分不改变,否则设为0 |
cv2.THRESH_TOZERO_INV | THRESH_TOZERO的反转 |
直方图与模板匹配
cv2.calcHist(images,channels,mask,histSize,ranges)
images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并 使用它。
histSize:BIN 的数目。也应用中括号括来
ranges: 像素值范围常为 [0256]