本文章介绍opencv 的基础基础图像处理API和部分API原理,包括图像的读写和展示,图像的旋转,缩放,平移,镜像,仿射变换。使用python 语言编写。版本 3.6 ,opencv 3 版本

01 图片的读写和展示:

import cv2
# 读取当前文件夹下面image.png 图片,  1 表示彩色方式读取, 0 表示黑白读取
img=cv2.imread("image.png",1)
# 展示这个图片,弹出窗口的标题是 “image”
cv2.imshow('image',img)
# 防止程序闪退,图像窗口等待用户手动关闭
cv2.waitKey(0)
-1
import cv2
# 读取一个图像文件
img=cv2.imread('image.png',1)
# 将图像文件写入一个新文件。
cv2.imwrite('image.jpg',img)
True
# 在图片文件中画一条线(实际上就是对图像矩阵做颜色变化)
import cv2
img=cv2.imread("image.jpg",1)
(b,g,r)=img[100,100]
print(b,g,r)

# 在 (10,100) -----(110,100)画一条蓝色的线段
for i in range(1,100):
    #图片颜色模式是(b,g,r)的
    img[10+i,100]=(255,0,0)
cv2.imshow("image",img)
cv2.waitKey(0)

02图片缩放

# 使用opencv 的API resize 来进行缩放
import cv2
img=cv2.imread("image.png",1)
imageInfo=img.shape
print(imageInfo)
# 输出表示长宽,模式为RGB
width=imageInfo[1]
height=imageInfo[0]
mode=imageInfo[2]
# 定义缩放后的大小
new_width=int(width*0.5)
new_height=int(height*0.5)
# 使用resize 函数进行缩放
new_img=cv2.resize(img,(new_width,new_height))
cv2.imshow('resize after',new_img)
cv2.imshow('resize before',img)
cv2.waitKey(0)
(678, 1464, 3)
-1
# 使用最近邻域插值原理实现缩放
# 最近邻域插值是计算机图形学的基础知识,则这里不赘述,需要可以自行百度
import cv2
import numpy as np
img=cv2.imread("image.png",1)
imageInfo=img.shape
width=imageInfo[1]
height=imageInfo[0]
mode=imageInfo[2]
# 定义缩放之后的大小
rate =0.5
new_width=int(width*rate)
new_height=int(height*rate)
# 新建一个空白的模板:
# 数值类型是 8位无符号整数,表示的范围是 0- 255 
blank=np.zeros((new_height,new_width,mode),np.uint8)
for row in range(0,new_height):
    for col in range(0,new_width):
        row_temp=int(row*(height*1.0/new_height))
        col_temp=int(col*(width*1.0/new_width))
        blank[row,col]=img[row_temp,col_temp]
cv2.imshow('after resize',blank)
cv2.imshow('before resize',img)
cv2.waitKey(0)
-1

03图片剪切

# 图片剪切实际上就是将图片上的某一部分复制到新的图片上的国哦成
import cv2
img=cv2.imread("image.png",1)
# 截取 200-300 行,300-400列的图像部分:
new_img=img[100:200,300:400]
cv2.imshow('image',new_img)
cv2.waitKey(0)
-1

图片移位

import cv2
import numpy as np
img=cv2.imread('image.png',1)
cv2.imshow('src', img)

imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
# 定义移位矩阵: (2 x 3 的矩阵)
matshift=np.float32([[1,0,100],[0,1,200]])
# 生成目标图像
# warpAffine(原图,运算矩阵,(原图像高,原图像宽))
new_img=cv2.warpAffine(img,matshift,(width,height))
cv2.imshow("after shift",new_img)
cv2.waitKey(0)
-1
# 图片移位算法原理
"""
(1) 矩阵算法(以上面的矩阵为例)
matshift=[[1,0,100],[0,1,200]]   2 x 3
可以拆分成两个矩阵:
A=[[1,0],[0,1]]   2 x 2
B=[[100],[200]]   2 x 1
C=xy    2 x 1
A*C+B=[[1*x+0*y],[0*x+1*y]]+[[100],[200]] = [[x+100],[y+200]]
(2) 映射方法:
原图点+偏移=目标图点:
例如  (10,20)-->(110,220)
"""
import cv2
import numpy as np
img=cv2.imread('image.png',1)
cv2.imshow('src', img)
imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
new_img=np.zeros(imageInfo,np.uint8)

# 实现移位功能:
for row in range(100,height):
    for col in range(200,width):
        new_img[row,col]=img[row-100,col-200]
cv2.imshow("after shift",new_img)
cv2.waitKey(0)
-1

04图片镜像变换

# 任务: 将图像以水平方线为轴做对称变换
import cv2
import numpy as np
img=cv2.imread('img.jpg',1)
cv2.imshow('src', img)

imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
mode=imageInfo[2]
new_img=np.zeros((height*2,width,mode),np.uint8)

for row in range(0,height):
    for col in range(0,width):
        new_img[row,col]=img[row,col]
        new_img[row+height,col]=img[height-1-row,col]

# 绘制水平线
for i in range(0,width):
    new_img[height,i]=(0,0,255)
    new_img[height-1,i]=(0,0,255)
cv2.imshow('after screen operation',new_img)
cv2.waitKey(0)
-1

05实现图片的仿射变换

import cv2
import numpy as np
img=cv2.imread('img.jpg',1)
cv2.imshow('src', img)

imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]

# 从原图上找三个点(可以确定唯一的一个面)
matsrc=np.float32([[0,0],[0,height-1],[width-1,0]])
# 给出这三个点被映射到新图的位置:
mat_new_img=np.float32([[50,50],[300,height-200],[width-300,100]])

matAffine=cv2.getAffineTransform(matsrc,mat_new_img)
new_img=cv2.warpAffine(img,matAffine,(width,height))
cv2.imshow('after',new_img)
cv2.waitKey(0)
-1

06图片旋转

import cv2
import numpy as np
img=cv2.imread('img.jpg',1)
cv2.imshow('src', img)

imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]

# 旋转矩阵:
# 第一个参数是旋转的基础点(以哪个点进行旋转) 第二个是旋转的角度
# 第三个是缩放的比率
matRotate=cv2.getRotationMatrix2D((width/2,height/2),45,0.5)
new_img=cv2.warpAffine(img,matRotate,(width,height))
cv2.imshow('after rotate',new_img)
cv2.waitKey(0)

07线段绘制

import cv2
import numpy as np
# 定义画布的大小和颜色深度:
# 这里定义画布大小为 高 500 宽 500 颜色深度为 3
imageInfo=(500,500,3)

img=np.zeros(imageInfo,np.uint8)

# 绘制线段:
# 第一个参数是画布,第二个参数是起始点,第三个参数是终止点,第四个参数是颜色(b,g,r)
cv2.line(img,(100,100),(400,400),(0,0,255))
# 第五个参数是线的宽度
cv2.line(img,(100,100),(400,100),(0,0,255),20)
# 第六个参数为线条的类型:这里选择的类型可以消除锯齿:
cv2.line(img,(100,400),(400,400),(0,0,255),cv2.LINE_AA)
cv2.imshow("new image",img)
cv2.waitKey(0)
-1

08 矩形圆形和多边形绘制

import cv2
import numpy as np
# 定义画布的大小和颜色深度:
# 这里定义画布大小为 高 500 宽 500 颜色深度为 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
# 绘制矩形:
# 第一个参数是画布,第二个参数是左上角的点,第三个参数是右下角的点,第四个参数是颜色,第五个参数是线条宽度
# 如果第五个参数是 -1 ,代表了填充, 大于0 的话代表的是线条宽度。
cv2.rectangle(img,(100,100),(200,200),(255,0,0),-1)
cv2.rectangle(img,(300,300),(400,400),(0,255,0),5)
cv2.imshow("new image",img)
cv2.waitKey(0)
-1
# 绘制圆形和椭圆形
import cv2
import numpy as np
# 定义画布的大小和颜色深度:
# 这里定义画布大小为 高 500 宽 500 颜色深度为 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
# 绘制圆形:
# 绘制圆形和椭圆形
import cv2
import numpy as np
# 定义画布的大小和颜色深度:
# 这里定义画布大小为 高 500 宽 500 颜色深度为 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
# 绘制圆形:
# 参数和矩形的大概一致,只是第二个参数是圆心位置,第三个参数是半径。
cv2.circle(img,(100,100),50,(0,255,255),-1)
cv2.circle(img,(300,100),50,(0,255,0),3)

# 绘制椭圆形
# 参数:画布大小,(长轴和短轴) 起始偏转角度,起始角度,终止角度,颜色,填充和线宽。
cv2.ellipse(img,(300,300),(150,100),45,0,360,(0,255,255),-1)

cv2.ellipse(img,(130,400),(100,40),0,0,360,(0,255,255),-1)
cv2.imshow("new image",img)
cv2.waitKey(0)
-1

09 绘制任意多边形

import cv2
import numpy as np
# 定义画布的大小和颜色深度:
# 这里定义画布大小为 高 500 宽 500 颜色深度为 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
# 绘制任意的多边形
# 首先定义多边形的点集合:
points=np.array([[150,50],[140,140],[200,170],[250,250],[150,50]],np.int32)
points=points.reshape((-1,1,2))
cv2.polylines(img,[points],True,(0,255,255))

cv2.imshow("new image",img)
cv2.waitKey(0)
-1

10 绘制文字和图像

# 绘制文字和图像到画布
import cv2
import numpy as np
font=cv2.FONT_HERSHEY_COMPLEX
# 定义画布的大小和颜色深度:
# 这里定义画布大小为 高 500 宽 500 颜色深度为 3
imageInfo=(500,500,3)
img=np.zeros(imageInfo,np.uint8)
copy=cv2.imread("img.png",1)

# 绘制文字
cv2.putText(img,"hello world!",(150,350),font,1,(255,0,0),2,cv2.LINE_AA)
# 绘制图像
print(copy.shape)
# 定义绘制图像的大小:
width=175
height=175
# 定义绘制图像的位置:
local=[100,160]
for i in range(0,height):
    for j in range(0,width):
        img[i+local[0],j+local[1]]=copy[i,j]

cv2.imshow("old image",copy)
cv2.imshow("new image",img)
cv2.waitKey(0)
(1188, 2109, 3)
-1