image.png

参考:

1.python图像识别角度_Python Opencv实现图像轮廓识别功能
2.[Python图像处理] 五.图像融合、图像加减法、图像逻辑运算及图像类型转换
3.OpenCV从零基础—-检测及分割图像的目标区域
4.爬了几万篇文章看python OpenCV应用

图形学基础

1.图像的基础知识

Dpi

1英寸=2.54厘米,dpi是”点每英寸”的意思;这张图300dpi,就是每英寸会打印出300个点
图片的dpi应该就是照相机(或手机)的系统所给定的。

图像与像素

图像都是由像素( pixel )构成的,就像下面的这种小方格:
OpenCV - 图7
这些小方格每一个都有自己明确的位置和被分配的色彩值,而这些小方格的颜色和位置就决定了这个图像所呈现出来的样子。
像素是图像中最小的单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。
图像通常包括有二值图像灰度图像彩色图像
OpenCV - 图8

二值图像

二值图像就是在图像中,任何一个点非黑即白,像素要么为 255 (白色) 要么为 0 (黑色) 。转换的时候一般将像素 >=127 的设置为白色,其余的设置为黑色。
OpenCV - 图9

灰度图像

灰度图像是除了黑白之外,还添加了第三种颜色:灰色,灰色把灰度划分为 256 个不同的亮度,例如纯白色,它的亮度级别是255。
图像转化为灰度图像有以下几种算法:

  • 浮点算法:Gray = R_0.3 + G_0.59 + B * 0.11
  • 整数方法:Gray = ( R_30 + G_59 + B * 11 ) / 100
  • 移位方法:Gray = ( R_76 + G_151 + B * 28 ) >> 8
  • 平均值法:Gray = ( R + G + B ) / 3
  • 仅取绿色:Gray = G
  • 加权平均值算法:R = G = B = R_0.299 + G_0.587 + B * 0.144

OpenCV - 图10

彩色图像

彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。

第1章 课程介绍与学习指南

1.车辆检测

image.png

image.png
image.png

1-2 OpenCV导学

image.png

image.png

1.目标识别

image.png

2.自动驾驶

车道检测:
image.png

3.医学图像分析

image.png

4.视频内容理解与分析

image.png

5.CV就是要理解图像中的内容

通过model渲染出图像,
通过图像理解图像内容的理解;

image.png

6.CV与FFmpeng的关系

image.png

PNG、JPG

7.CV的未来

image.png83

8.三大项目

image.png
image.png

image.png

1-3 计算机视觉到底是什么

image.png

image.png

image.png

第4章 OpenCV必知必会基础

本章带你掌握OpenCV必知必会的基础知识,包括色彩空间的变换、ROI、OpenCV中最重要的结构体Mat以及获取图像的属性等。

图像的三通道与四通道

图片有三通道图片RGB和四通道图片RGBA,RGB我们都知道是代表红绿蓝三原色,而RGBA则在此基础上加入了透明度Alpha,Alpha的值会对RGB衍生的颜色造成影响。对于PIL的Image以及opencv2而言,它们都是可以正常的读取这中通道的图片的,这也是我一开始不知道的地方。
img=cv2.imread(‘haveAlpha.png’)直接读入图片是三通道的,只有
img=cv2.imread(‘haveAlpha.png’,-1)第二个参数为负数,才会将其透明度传入;img=Image.open(‘haveAlpha.png’)直接就是传入四通道的了。
但是问题是这两者的show方法显示图片却不能将其自动显示成白背景,而且,即使是读出之后再重新保存,其保存的图片颜色也会变得不正常,我想不出原因是什么,但是我们可以做的是自己把透明的背景变成白色。




4-1 RGB与BGR【OpenCV的色彩空间】

image.png
目标:通过API对像素进行操作;实现对图形的基本绘制;

颜色空间

image.png
RGB:三个发光源;
openCV BGR: 默认数据源排序 BGR;
HSV/HSB/HSL:饱和度,明亮度,

每一个颜色都是由三个数据组成的;
image.png
image.png

4-2 HSV与HSL【OpenCV的色彩空间】

目标:掌握HSV就可以了,HSL基本用不到;

HSV

image.png

image.png

image.png

S:最底下是灰色;
L:最底下是黑色;
只有R,没有GB,就是红色;

HSV可以根据色度判断背景,去除背景;

image.png

HSL

image.png

image.png

4-3 实战OpenCV色彩空间转换

目标:YUV,物体的定位;
YUV应用于视频中,HSV主要应用在OpenCV中,RGB、BGR主要用在显示器硬件中
image.png
YUV是由电视系统为了兼容黑白电视来的,
image.png
YUV应用于视频中,HSV主要应用在OpenCV中,RGB、BGR主要用在显示器硬件中

  1. import numpy as np
  2. import cv2
  3. def callback():
  4. pass
  5. img = cv2.imread('33.jpg')
  6. cv2.namedWindow('color', cv2.WINDOW_NORMAL)
  7. colorspaces = [cv2.COLOR_BGR2RGBA,
  8. cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV_FULL, cv2.COLOR_BGR2YUV]
  9. cv2.createTrackbar('curcolor', 'color', 0, 4, callback)
  10. index = cv2.getTrackbarPos('curcolor', 'color')
  11. cvt_img = cv2.cvtColor(img, colorspaces) # 颜色空间转换API
  12. cv2.imshow('dst', cvt_img)
  13. cv2.waitKey(0)
  14. cv2.destroyAllWindows()

4-4 图像操作的基石Numpy【基础操作】

目标:矩阵的操作

Numpy

image.png
image.png

1.创建数组

image.png

image.png

image.png

image.png
np.eye() 对角线是1的矩阵;
image.png

4-5 Numpy基本操作之矩阵的检索与赋值

目标:矩阵的检索与赋值;

图片的坐标 (y, x)
image.png

灰度的一层;彩色的三层;

  1. # 三通道颜色改变 BGR-012
  2. import numpy as np
  3. import cv2
  4. img = cv2.imread('33.jpg')
  5. img = cv2.resize(img, None, fx=0.5, fy=0.5)
  6. # 读取矩阵中y,x处的BGR颜色值;
  7. print(img[100,100])
  8. count = 0
  9. while count < 500:
  10. # 0B, 1G, 2R
  11. # img[count, 100, 0] = 255
  12. img[count, 100] = [0,0,255] # BGR三层颜色;
  13. count = count +1
  14. cv2.imshow('dst', img)
  15. cv2.waitKey(0)
  16. cv2.destroyAllWindows()

4-6 Numpy基本操作三-ROI

目标:获取子矩阵ROI Region of Image

子矩阵的格式
image.png

  1. import numpy as np
  2. import cv2
  3. img = cv2.imread('33.jpg')
  4. img = cv2.resize(img, None, fx=0.5, fy=0.5)
  5. print(img[100, 100])
  6. roi = img[100:400, 100:600]
  7. roi[:,:] = [0,0,255]
  8. cv2.imshow('dst', img)
  9. cv2.waitKey(0)
  10. cv2.destroyAllWindows()

4-8 OpenCV的重要结构体Mat

Mat

image.png
image.png

image.png

image.png

4-9 Mat的深拷贝与浅拷贝

OpenCV 中,用 Mat 表示数值矩阵,Mat 是很关键的一种数据结构,
目标
浅拷贝:headers是一样的,数据是共享的;
深拷贝:headers和data数据都拷贝一份;
image.png

image.png

image.png

  1. # 浅拷贝:
  2. import cv2
  3. import numpy as np
  4. img = cv2.imread('33.jpg')
  5. img2 = img
  6. img[10:100, 10:100] = [0, 0, 255]
  7. cv2.imshow('img', img)
  8. cv2.imshow('img2', img2)
  9. cv2.waitKey()
  10. cv2.destroyAllWindows()
  11. # 深拷贝:拷贝headers和数据部分
  12. import cv2
  13. import numpy as np
  14. img = cv2.imread('33.jpg')
  15. img2 = img
  16. img3 = img.copy()
  17. img[10:100, 10:100] = [0, 0, 255]
  18. cv2.imshow('img', img)
  19. cv2.imshow('img2', img2)
  20. cv2.imshow('img3', img3)
  21. cv2.waitKey()
  22. cv2.destroyAllWindows()

4-11 图像的多种属性

目标:访问mat的属性;

  1. import cv2
  2. import numpy as np
  3. img = cv2.imread('33.jpg')
  4. # y,x,3
  5. print(img.shape)
  6. # 内存空间 y*x*3
  7. print(img.size)
  8. # 图像中每个元素的位深
  9. print(img.dtype) # uint8
  10. cv2.imshow('img', img)
  11. cv2.waitKey()
  12. cv2.destroyAllWindows()

4-12 通道的分割与合并

三通道:BGR
目标:split与merge
image.png

  1. import cv2
  2. import numpy as np
  3. img = cv2.imread('33.jpg')
  4. # y,x,3
  5. img = cv2.resize(img, None, fx=0.5, fy=0.5)
  6. b, g, r = cv2.split(img)
  7. b[10:100, 10:100] = 0
  8. g[10:100, 10:100] = 0
  9. img2 = cv2.merge((b, g, r))
  10. cv2.imshow('img', img2)
  11. cv2.waitKey()
  12. cv2.destroyAllWindows()

第5章 OpenCV实现图形的绘制

本章带你掌握OpenCV中最基本的图形绘制,包括线、矩形、圆等,最后还将前面课程中鼠标的控制与图形的基本绘制结合,手把手带你实现一个经典绘制的作业。

第6章 OpenCV的算术与位运算

本章详细介绍了图像的算述运算和位运算,最后通过为图像添加水印的大作业使同学们可以知道如何运用课程中所讲的方法。

实战应用

参考:

1.python-OpenCV之轮廓的查找,绘制,特征,近似,外接矩形
2.Python+OpenCV为图片添加中文水印与图片水印;
3.OpenCV图像无缝融合-seamlessClone介绍与使用(Python/C++源码)

图像操作

  1. import cv2
  2. import time
  3. import numpy as np
  4. def main():
  5. # 程序计时
  6. start = time.perf_counter()
  7. # 显示图片
  8. img = cv2.imread("33.jpg")
  9. # 图片缩放
  10. img = cv2.resize(img, None, fx=0.8, fy=0.8)
  11. kernel = np.ones((3, 3), np.float32) / 10
  12. # 卷积操作,-1表示通道数与原图相同
  13. dst = cv2.filter2D(img, -1, kernel) # 2D 卷积
  14. blur = cv2.blur(img, (3,3)) # 均值滤波
  15. gaussian = cv2.GaussianBlur(img, (5, 5), 1) # 高斯滤波
  16. #9 邻域直径,两个 75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
  17. bilater = cv2.bilateralFilter(img,100,75,75) # 双边滤波 ---
  18. kernel = np.ones((5, 5), np.uint8)
  19. erosion = cv2.erode(img, kernel) # 腐蚀
  20. dilation = cv2.dilate(img, kernel) # 膨胀
  21. kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 开运算
  22. opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
  23. closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) # 闭运算
  24. gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
  25. # src - opening
  26. tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
  27. # closing - src
  28. blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
  29. # cv2.imshow('filter', dst)
  30. cv2.imshow('img', img)
  31. cv2.imshow('tophat', tophat)
  32. cv2.imshow('blackhat', blackhat)
  33. # cv2.imshow('blur', blur)
  34. # cv2.imshow('gaussian', gaussian)
  35. # cv2.imshow('bilater', bilater)
  36. # cv2.imshow('erosion', erosion)
  37. # cv2.imshow('opening', opening)
  38. # cv2.imshow('closing', closing)
  39. cv2.waitKey()
  40. cv2.destroyAllWindows()

1.OpenCV图像无缝融合-seamlessClone介绍与使用(Python/C++源码)

remove_background.py
seamlessClone是OpenCV3后添加的函数,使用此函数可以轻松将一幅图像中的指定目标复制后粘贴到另一幅图像中,并自然的融合。函数说明:
OpenCV - 图58
参数:

src 输入8位3通道图像(截取目标的大图)
dst 输入8位3通道图像(待粘贴融合的目标背景图标)
**mask

| 输入8位1或3通道图像(目标掩码区域图像) | | p | 对象被放置在目标图像dst中的位置 | | blend

| 输出图像,与dst具有相同大小和类型。 | | flags** | 克隆方法可以是cv :: NORMAL_CLONE,cv :: MIXED_CLONE或cv :: MONOCHROME_TRANSFER |

-NORMAL_CLONE: 不保留dst 图像的texture细节。目标区域的梯度只由源图像决定。
-MIXED_CLONE: 保留dest图像的texture 细节。目标区域的梯度是由原图像和目的图像的组合计算出来(计算dominat gradient)。
-MONOCHROME_TRANSFER: 不保留src图像的颜色细节,只有src图像的质地,颜色和目标图像一样,可以用来进行皮肤质地填充。


对比发现第二种MIXED_CLONE参数效果融合最自然,不会覆盖背景图信息。
放花灯程序实现步骤
(1) 使用OpenCV鼠标事件绘制矩形截取Rect设置mask(不会的话看我B站的视频教程有详细讲解);
(2) 使用seamlessClone完成图像融合。
效果见开头效果视频,源码如下:
(1) Python版本:

  1. import cv2
  2. import numpy as np
  3. flag = False
  4. x1=y1=0
  5. def gen_light(rect):
  6. global temp2,result,dst,temp
  7. temp2 = temp.copy() #原图备份
  8. mask1 = np.zeros(temp2.shape, temp2.dtype)
  9. cv2.rectangle(mask1,rect,(255,255,255),-1)
  10. result = cv2.seamlessClone(temp2, dst, mask1, (400,200), cv2.MONOCHROME_TRANSFER)
  11. cv2.imshow('result',result)
  12. def screenShot(event,x,y,flags,param):
  13. global x1,y1,flag,img,temp
  14. if event==cv2.EVENT_LBUTTONDOWN: #鼠标左键按下
  15. flag = True #表示当前鼠标左键是按下的
  16. x1 = x
  17. y1 = y
  18. elif event==cv2.EVENT_MOUSEMOVE: #鼠标移动
  19. if(flag):
  20. img = temp.copy()#原图复制(把绘制的矩形清空)
  21. cv2.rectangle(img,(x1,y1),(x,y),(0,255,0),2)
  22. elif event==cv2.EVENT_LBUTTONUP: #鼠标左键弹起
  23. flag = False
  24. ROI = temp[y1:y,x1:x] #---y1:y2, x1:x2
  25. gen_light((x1,y1,x-x1,y-y1))
  26. img = cv2.imread('light.jpg') #读取图像
  27. dst = cv2.imread("./2.jpg")
  28. temp = img.copy() #原图备份
  29. cv2.imshow("result", dst)
  30. cv2.namedWindow('selectROI')
  31. cv2.setMouseCallback('selectROI',screenShot)
  32. while(1):
  33. cv2.imshow('selectROI',img)
  34. if cv2.waitKey(1)&0xFF==27: #Esc按下退出
  35. break
  36. cv2.destroyAllWindows()