opencv基础简洁版(python)一

图像简单介绍

 

rgb :光的三原色,也即红绿蓝Red、Green、Blue,它们的最大值是255,相当于100%

hvs:色调(H)饱和度(S)明度(V)

灰度:只有亮度 阈值0~255  0代表暗 255代表亮

H表示图片的宽,W表示图片的高,C表示图片的通道数  

rgb是三通道  灰度图是单通道只有亮度

加载图片

第一个代码

import cv2
import matplotlib.pyplot as plt# 导入 maplotlib
img = cv2.imread("D:/23.png")
cv2.imshow('First',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 需要改成你的文件路径和名字和格式

img = cv2.imread("文件路径/名字.格式")

 为了方便我定义了一个专门显示的窗口

def cv_show(neme,img):
    cv2.imshow(neme,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

我后面调用只需要cv_show()这个函数即可

import cv2
import matplotlib.pyplot as plt# 导入 maplotlib
def cv_show(neme,img):
    cv2.imshow(neme,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    return None
img = cv2.imread("D:/23.png")
cv_show('First',img)
 

print(img.shape)打印加载图片的hwc

print(type(img))  打印类型  

print(img.size) 打印像素点个数

cv2.IMREAD_COLOR:彩色图像

cv2.lMREAD GRAYSCALE:灰度图像

或者0代表灰度 1代表彩色

加载视频

import cv2
video = cv2.VideoCapture("D:/talou.mp4",)

# 检查是否打开正确
if video.isOpened():
    # 我们都知道视频和游戏其实都是由图像组成的,通过访问图像的帧数连贯形成的,这里也是一样
    # video.read() 一帧一帧地读取
    # open 得到的是一个布尔值,就是 True 或者 False
    # frame 得到当前这一帧的图像
    open, frame = video.read()
else:
    open = False

while open:
    ret, frame = video.read()
    # 如果读到的帧数不为空,那么就继续读取,如果为空,就退出
    if frame is None:
        break
    if ret == True:
        # 转换为灰度图
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow("video",gray)
        # 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快
        # 这里等于 27 也即是说按下 ESC 键即可退出该窗口
        if cv2.waitKey(10) & 0xFF == 27:
            break
video.release()
cv2.destroyAllWindows()

原理将视频处理成一帧一帧的图片  逐桢读

图像修剪

用来自瞄中间板块 会经常用到只取图像的一部分

img =img[0:200,0:200] #宽0~200   长0~200的意思

 颜色通道提取

B0  G1  R2  python列表

b,g,r =cv2.merge(img)

cat =ing.copy()

cat [:,:,0] =0

cat [:,:,1] =0

边界填充

cv2.copyMakeBorder()函数

top_size,bottom_size,left_size,right_size =(50,50,50,50)

BORDER_REPLICATE:复制法,也就是复制最边缘像素。

BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:

BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,

BORDER_CONSTANT:常量法,常数值填充。

fuzhi =cv2.copyMakeBorder(img,top_size, bottom_size,left_size,right_size,borderType =cv2.BORDER_REPLICATE)

图像融合

import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread("./1.jpg")
img_cat = cv.imread("./2.jpg")
# 设置与 img 一样的数值
img_cat = cv.resize(img_cat,(721,300))

# 设置宽度值
res = cv.addWeighted(img,0.4,img_cat,0.6,0)

# 图像显示
plt.imshow(res)
plt.show()

图像阈值

cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取O

cv2.THRESH_BINARY_INV THRESH_BINARY的反转

cv2.THRESH_TRUNC大于阈值部分设为阈值,否则不变

cv2.THRESH_TOZERO大于阈值部分不改变,否则设为0

cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

ret, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY)

图像平滑处理

卷积矩阵

均值滤波 

3  5  7一般

blur =cv2.blur(img,(3,3))

平均值 

方框滤波

box = cv2.boxFilter(img,-1,(3,3),normalize=True)

 和均值滤波一样  normalize=True要做归一化  normalize=False不做归一化(可能越界 越界部分全部为255)

高斯滤波

aussian = cv2.GaussianBlur (img,(5,5),1)

 越靠近 像素越重要 权重系数越大

中值滤波

median = cv2.medianBlur (img,5)

 5代表5x5 25个值按从小到大排序 取中值13的值

同时展示值     

res =np.vstack(?,?,median)
cv_show('First',res)

 hstack可以改成vstack

形态学—腐蚀操作

kernel = np. ones ((5,5) , np.uint8)
erosion = cv2.erode(img, kernel,iterations = 6)

去掉一些细小的特征 会使整张图片变的模糊  (5,5)代表卷积矩阵 iterations = 6代表迭代次数6次

形态学—膨胀操作

kernel = np. ones ((5,5) , np.uint8)
dig_dilate = cv2.dilate(erosion, kernel,iterations = 1)

开运算与闭运算 

开运算

kernel = np. ones ((5,5) , np.uint8)
opening =cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv_show('First',opening)
print(img)

闭运算

kernel = np. ones ((5,5) , np.uint8)
closing =cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
cv_show('First',closing)
print(img)

 开运算  先腐蚀再膨胀  ///  闭运算  先膨胀再腐蚀

梯度运算

kernel = np. ones ((7,7) , np.uint8)
gradient =cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv_show('First',gradient)

梯度 =膨胀 -腐蚀

礼帽与黑帽子

kernel = np. ones ((7,7) , np.uint8)
tophat =cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv_show('First',tophat)

礼帽:原始输入-开运算结果

kernel = np. ones ((7,7) , np.uint8)
blackhat =cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv_show('First',blackhat)

黑帽子:闭运算-原始输入

图像梯度—Sobel

G{x} =\begin{bmatrix} -1&0 &+1 \\ -2& 0& +2\\ -1 &0 &+1 \end{bmatrix}*A and G{y}=\begin{bmatrix} -1 &-2 &-1 \\ 0 & 0 &0 \\ +1&+2 & +1 \end{bmatrix}*A

sobelx = cv2.Sobel(img, cv2.CV_64F,1,0,ksize=3)
cv_show('First',sobelx)

ddepth:图像的深度

dx和dy分别表示水平和竖直方向

ksize是Sobel算子的大小

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV小项目 这是一个个人在使用OpenCV过程中写的一些小项目,以及一些非常有用的OpenCV代码,有些代码是对某论文中的部分实现。 注意:代码是在Xcode里写的,如果要在win下测试,遇到问题自己修改。 opencv-rootsift-py 用pythonOpenCV写的一个rootsift实现,其中RootSIFT部分的代码参照Implementing RootSIFT in Python and OpenCV这篇文章所写,通过这个你可以了解Three things everyone should know to improve object retrieval这篇文章中RootSIFT是怎么实现的。 sift(asift)-match-with-ransac-cpp 用C++和OpenCV写的一个图像匹配实现,里面包含了采用1NN匹配可视化、1NN匹配后经RANSAC剔除错配点可视化、1NN/2NN<0.8匹配可视化、1NN/2NN<0.8经 RANSAC剔除错配点可视化四个过程,其中1NN/2NN<0.8匹配过程是Lowe的Raw feature match,具体可以阅读Lowe的Distinctive image features from scale-invariant keypoints这篇文章。这个对图像检索重排非常有用。另外里面还有用OpenCV写的ASIFT,这部分来源于OPENCV ASIFT C++ IMPLEMENTATION,ASIFT还可以到官网页面下载,ASIFT提取的关键点 比SIFT要多得多,速度非常慢,不推荐在对要求实时性的应用中使用。 更多详细的分析可以阅读博文SIFT(ASIFT) Matching with RANSAC。 有用链接 OpenCV3.0文档 // 测试sparse unsigned int centersNum = 10; vector descrNums; descrNums.push_back(8); descrNums.push_back(12); //unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5; 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5, 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; sp_mat Hist(descrNums.size(), centersNum); static long int count = 0; for (int i = 0; i < descrNums.size(); i++){ unsigned int* desrcElementsTmp = new unsigned int[descrNums[i]]; memcpy(desrcElementsTmp, T + count, descrNums[i] * sizeof(T[0])); //cout << desrcElementsTmp[0] << '\t' << desrcElementsTmp[1] << '\t' << desrcElementsTmp[2] << '\t' << desrcElementsTmp[3] << '\t' << desrcElementsTmp[4] << '\t' <<endl; //cout << desrcElementsTmp[5] << '\t' << desrcElementsTmp[6] << '\t' << desrcElementsTmp[7] << '\t' << desrcElementsTmp[8] << '\t' << desrcElementsTmp[9] << '\t' << desrcElementsTmp[10] << '\t' <<endl; //cout << endl; sp_mat X(1, centersNum); X.zeros(); for (int j = 0; j < descrNums[i]; j++){ X(0, desrcElementsTmp[j]-1) += 1; } X.print("X:"); X = X/norm(X, 2); Hist.row(i) = X; count = count + descrNums[i]; delete desrcElementsTmp; } //Hist.print("Hist:");

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值