pytorch opencv基础

import torch
import numpy
from torch.utils.data import TensorDataset
from troch.utils.data import DataLoader


#TensorDataset将数据和标签封装到一起,再用DataLoader封装后即可在for中实现每次一个batch_size
train = TensorDataset(train_x, train_y)
train = DataLoader(train, batch_size = k, shuffle = True)

test = TensorDataset(test_x, test_y)
test = DataLoader(test, batch_size = k, shuffle = True)

model = torch.nn.Sequential(
    torch.nn.Linear(128, 64),
    torch.nn.Sigmoid(),
    torch.nn.Linear(64, 10))


loss = torch.nn.MSELoss()
optimizer = torch.optim.Adam()

for i in range(100):
    for x, y in train:
        #model.train():训练时加上,会正常使用Batch Normalization 和 Dropout
        #model.eval():测试时加上,不会使用Batch Normalization 和 Dropout
        model.train()
        pred = model(x)
        loss_value = loss(pred, y)
        loss_value.backward()
        optimizer.step()
    for xt, yt in test:
        model.eval()
        test_pred = model(test_x)
        test_loss_value = loss(test_pred)

opencv读取视频

import cv2
import torch
import torch.nn as nn
import torch.nn.functional as F

vc = cv2.VideoCapture('C:/Users/Dell/Downloads/2.mp4')


if vc.isOpened():
    flag, frame = vc.read()
else:
    flag = False

while(flag):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('name', frame)
    if cv2.waitKey(10) & 0xFF == 27:
        break
    flag, frame = vc.read()
vc.release()
cv2.destroyAllWindows()

图像合并:

img1 = cv2.imread('C:/Users/Dell/Downloads/1.jpg')
img2 = cv2.imread('C:/Users/Dell/Downloads/3.jpg')

img1 = cv2.resize(img1, (700, 533)) #合并之前先调整到一致的大小


img = cv2.addWeighted(img1, 0.4, img2, 0.6, 0) #img = 0.4 * img1 + 0.6 * img2 + 0
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

阈值处理:

img1 = cv2.imread('C:/Users/Dell/Downloads/1.jpg')
img2 = cv2.imread('C:/Users/Dell/Downloads/3.jpg')

ret, img = cv2.threshold(img1, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow('img', img)

if cv2.waitKey(0) & 0xFF == 27:
    cv2.destroyAllWindows()
import torch
import torch.nn as nn
import torch.nn.functional as F
import cv2
import numpy as np


img1 = cv2.imread('C:/Users/Dell/Downloads/1.jpg')
img2 = cv2.imread('C:/Users/Dell/Downloads/3.jpg')



#均值滤波,用3 * 3的权值为全1的卷积核做内积,将结果求均值
# img = cv2.blur(img1, (3, 3))
# cv2.imshow('img', img)


#方框滤波,当normalize = True时,和均值滤波一样
#当normalize = False时,内积后不求平均,若超过255,则赋值为255
# img = cv2.boxFilter(img1, -1, (3, 3), normalize = False)
# cv2.imshow('img', img)


#高斯滤波:卷积核内的数值满足高斯分布,更重视中心位置,离中心越远重要性越低
# img = cv2.GaussianBlur(img, (5, 5), 1)
# cv2.imshow('img', img)

#中值滤波:用卷积核框起来的数中的中值代替

# img = cv2.medianBlur(img1, 5)
# cv2.imshow('img', img)


#将几张图片一起显示,注意img1和img2大小要相等,可以先resize

img1 = cv2.resize(img1, (700, 533)) #合并之前先调整到一致的大小

res = np.hstack((img1, img2)) #横着一排
res = np.vstack((img1, img2)) #竖着一排
cv2.imshow('all', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

腐蚀操作:

#腐蚀操作:在任意处画框,将在框内的边界内的点腐蚀,且此时框同时框住边界外和边界内
kernel = np.ones((3, 3), np.uint8)
img = cv2.erode(img1, kernel, iterations = 1)  #原图片,框的大小,迭代次数(腐蚀次数) = 1

膨胀操作:

img_dilate = cv2.dilate(img1, kernel, iterations = 1) #和腐蚀传入的参数一样

开运算和闭运算:

kernel = np.ones((5, 5), dtype = np.uint8)

#开运算:先腐蚀,再膨胀
img_open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

#闭运算:先膨胀,再腐蚀
img_close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)



cv2.imshow('img', img_open)
cv2.waitKey(0)
cv2.destroyAllWindows()

梯度运算:

#梯度运算:结果 = 膨胀 - 腐蚀
img_grad = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

礼帽和黑帽:

#礼帽:原始图像 - 开运算
img_tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)


#黑帽:闭运算 - 原始图像
img_blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

Sobel算子求图像边缘:

分别为水平和垂直的卷积核,其中A为原始图像,Gx和Gy为替代3 * 3大小的中间值

#Sobel算子:用于边缘检测(灰度值变化剧烈的地方就是边缘)
#(原图像, 深度:-1表示与原图像深度相同, 水平, 垂直, 卷积核大小:为1 3 5 7)
#水平和垂直不能同时为1,各自求完相加即可

#img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

sobelx = cv2.Sobel(img1, -1, 1, 0, ksize = 3)
#需要abs的原因为:3 * 3的kerbel为-1 0 1 内积时是左边减右边,若左边小,则结果就会为负值,而灰度值为0 - 255,因此取个绝对值
#                                -2 0 2  垂直时同理
#                                -1 0 1
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img1, -1, 0, 1, ksize = 3)
sobely = cv2.convertScaleAbs(sobely)
sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
cv2.imshow('sobelx', sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

Scharr算子:

#Scharr算子:scharr与sobel算子思想一样,只是卷积核的系数不同,
#提取边界也更加灵敏,能提取到更细小的边界,但请注意,越是灵敏就越是可能误判,卷积核默认3 * 3

scharrx = cv2.Scharr(img1, -1, 1, 0)
scharry = cv2.Scharr(img1, -1, 0, 1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)

scharr = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
cv2.imshow('scharr', scharr)

cv2.waitKey(0)
cv2.destroyAllWindows()

Laplacian算子:

#Laplacian算子:没有水平和垂直之分
laplacian = cv2.Laplacian(img1, -1)
cv2.imshow('laplacian', laplacian)

cv2.waitKey(0)
cv2.destroyAllWindows()

高斯金字塔:

向下采样(将图像变小):将图像与高斯内核卷积,之后将所有偶数行和列去掉

向上采样(放大):将图像在每个方向都扩大为原来的两倍,新增的行和列用0填充

img_u = cv2.pyrUp(img1)
img_d = cv2.pyrDown(img1)

cv2.imshow('img', img_d)
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/WTSRUVF/p/15240279.html