opencv处理图像笔记

示例参考[OpenCV-Python] OpenCV 核心操作 部分 III
1 roi
提取感兴趣区域,``

import cv2
import numpy as np
from matplotlib import pyplot as plt
# cv2读入的是BGR格式
img = cv2.imread('test.jpg')
# 注意H*W,第一个参数为高度,y方向的阈值,第二个参数为宽度,x方向的阈值,比如我这里取眼睛
r_eye = img[283:292,166:221]
# matplotlib显示的是RGB,故需要做一下转换
# 还可以通过cv2.cvtColor(r_eye,cv2.COLOR_BGR2RGB),进行格式转换
# [2,1,0]更改通道顺序
plt.imshow(r_eye[:,:,[2,1,0]])
plt.show()

2
2 图像算术运算
2.1 图像混合

# 图片融合,图片大小必须一致
ax = fig.add_subplot(245)
ax.imshow(cv2.cvtColor(bg,cv2.COLOR_BGR2RGB))
# img.shape[0]是高度,img.shape[1]是宽度
# cv2.resize中的顺序却是宽度、高度
bg = cv2.resize(bg,(img.shape[1],img.shape[0]))
ax = fig.add_subplot(246)
ax.imshow(cv2.cvtColor(bg,cv2.COLOR_BGR2RGB))
ax = fig.add_subplot(247)
img_mer = cv2.addWeighted(img,0.7,bg,0.3,0)
ax.imshow(cv2.cvtColor(img_mer,cv2.COLOR_BGR2RGB))

1
2.2 按位运算
[Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理,因为RGB并不能反映物体的形态特征,只是从光学原理上颜色的调配。对文字识别的影响并不大。灰度化后,图片就可以降维了。
机器视觉的图像二值化详细分析,最简单的图片分割方法就是二值化,二值图像每个像素只有两种取值:要么纯黑,要么纯白

# 将图片灰度化
bg_gray = cv2.cvtColor(bg_src,cv2.COLOR_BGR2GRAY)
 # 图片二值化
ret, mask = cv2.threshold(bg_gray, 10, 255, cv2.THRESH_BINARY)

1
调整阈值由10调整100后,
1
阈值的选取有两种办法,手工调整太费劲,于是就有一些算法产生了。
一、全局阈值
指的是对整个图像中的每一个像素都选用相同的阈值。我们可以在Photoshop的图像-调整-阈值里体验,如果采用大津算法,即ret9, mask9 = cv2.threshold(bg_gray9, 0, 255, cv2.THRESH_OTSU),这个时候thresh设置成什么都不影响结果,ret9这里返回最佳的阈值

二、局部阈值
python-opencv函数总结之(一)threshold、adaptiveThreshold、Otsu 二值化,从下图可以看到adaptiveThreshold对于密集型的目标较为合适,他纹理都可以画出来。而主体轮廓反而不需要那么清晰

ax = fig.add_subplot(3,5,11)
img9 = cv2.imread('9.jpg')
bg_gray9 = cv2.cvtColor(img9,cv2.COLOR_BGR2GRAY)
# blockSize必须为奇数,不能为偶数
# C常量,对画面也有影响
mask9 = cv2.adaptiveThreshold(bg_gray9,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,21,2)
ax.imshow(cv2.cvtColor(mask9,cv2.COLOR_BGR2RGB))
#
ax = fig.add_subplot(3,5,12)
ret9, mask9 = cv2.threshold(bg_gray9, 0, 255, cv2.THRESH_OTSU)
ax.imshow(cv2.cvtColor(mask9,cv2.COLOR_BGR2RGB))
#
ax = fig.add_subplot(3,5,14)
mask9 = cv2.adaptiveThreshold(bg_gray9,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,21,0)
ax.imshow(cv2.cvtColor(mask9,cv2.COLOR_BGR2RGB))

2
roi替换,OpenCV之bitwise_and、bitwise_not等图像基本运算及掩膜

bg_src = cv2.imread('test3.jpg')
ax = fig.add_subplot(3,7,8)
img = cv2.resize(img,(bg_src.shape[1],img.shape[0]))
rows,cols,channels = bg_src.shape
roi = img[0:rows,0:cols]
bg_gray = cv2.cvtColor(bg_src,cv2.COLOR_BGR2GRAY)
ax.imshow(cv2.cvtColor(bg_gray,cv2.COLOR_BGR2RGB))
#
ax = fig.add_subplot(3,7,9)
ret, mask = cv2.threshold(bg_gray, 0, 255, cv2.THRESH_OTSU)
ax.imshow(cv2.cvtColor(mask,cv2.COLOR_BGR2RGB))
# 
mask_inv = cv2.bitwise_not(mask)
img1_bg = cv2.bitwise_and(roi,roi,mask=mask_inv)
img2_bg = cv2.bitwise_and(bg_src,bg_src,mask=mask)
dst = cv2.add(img1_bg,img2_bg)
img[0:rows,0:cols]=dst
# mask_inv取反后,非mask区域
ax = fig.add_subplot(3,7,10)
ax.imshow(cv2.cvtColor(mask_inv,cv2.COLOR_BGR2RGB))
# 
ax = fig.add_subplot(3,7,11)
ax.imshow(cv2.cvtColor(img1_bg,cv2.COLOR_BGR2RGB))
# 
ax = fig.add_subplot(3,7,12)
ax.imshow(cv2.cvtColor(img2_bg,cv2.COLOR_BGR2RGB))
# 
ax = fig.add_subplot(3,7,13)
ax.imshow(cv2.cvtColor(dst,cv2.COLOR_BGR2RGB))
ax = fig.add_subplot(3,7,14)
ax.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

3
3 几何变换
3.1 旋转
opencv中imread第二个参数的含义
Opencv-Python学习笔记五——图像翻转,平移,仿射及透视 warpAffine

import cv2
from matplotlib import pyplot as plt

fig = plt.figure(figsize=(15,15),dpi=60)
# 读取灰度图
img = cv2.imread('test3.jpg',0)
ax = fig.add_subplot(3,4,1)
ax.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
# 缩放
h,w = img.shape[:2]
img2 = cv2.resize(img,(2*w,2*h),interpolation=cv2.INTER_CUBIC)
ax = fig.add_subplot(3,4,2)
ax.imshow(cv2.cvtColor(img2,cv2.COLOR_BGR2RGB))
ax = fig.add_subplot(3,4,3)
rows,cols = img.shape
#这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
# M为变换矩阵,在中心点旋转45度,并缩放0.9倍
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.9)
# 几何变换,同时更改输出图片大小尺寸
dst = cv2.warpAffine(img,M,(cols,rows*2))
ax.imshow(cv2.cvtColor(dst,cv2.COLOR_BGR2RGB))
#
plt.show()

4
3.2 仿射变换
图像的旋转加上拉升就是图像仿射变换
opencv学习(三十五)之仿射变换warpAffine
opencv python 图像缩放/图像平移/图像旋转/仿射变换/透视变换
3.3 透视变换
透视变换之变换为鸟瞰图
透视投影矩阵推导

img = cv2.imread('test3.jpg')
ax = fig.add_subplot(3,3,4)
rows,cols,ch = img.shape
# 指定一个2*3矩阵,
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
ax.imshow(cv2.cvtColor(dst,cv2.COLOR_BGR2RGB))
# 透视变换
ax = fig.add_subplot(3,3,5)
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(cols,rows))
ax.imshow(cv2.cvtColor(dst,cv2.COLOR_BGR2RGB))
ax = fig.add_subplot(3,3,6)
ax.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

5
4 图片修复

发布了317 篇原创文章 · 获赞 168 · 访问量 46万+

猜你喜欢

转载自blog.csdn.net/warrah/article/details/102973003