Opencv基本图像操作

Opencv基本图像操作

目录

1.绘制矩形、圆形、线条等(7)

2.滑动条使用cv2.createTrackbar()(8)

3.像素替换、图片信息(9)

4.图片重叠与混合(10)

4.1透明混合

4.2不透明混合

5.几何变换(14)

5.1缩放

5.2旋转

5.3仿射变换

5.4透射变换


1.绘制矩形、圆形、线条等(7)

# -*- coding: utf-8 -*-
import numpy as np
import cv2
# Create a black image
img=np.zeros((256,256,3), np.uint8)
# Draw a diagonal blue line with thickness of 5 px
cv2.line(img,(0,0),(256,256),(255,0,0),1)   #颜色和粗细
cv2.rectangle(img,(2,2),(100,100),(0,255,0),1)
cv2.circle(img,(128,128), 127, (0,0,255), 0)   #-1则填充
cv2.ellipse(img,(128,128),(100,50),0,0,360,255,0)
pts=np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts=pts.reshape((-1,1,2))
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'Fuck you',(64,128), font, 1,(255,255,255),1)
winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

结果:

Opencv基本图像操作_第1张图片

2.滑动条使用cv2.createTrackbar()(8)

# -*- coding: utf-8 -*-
import cv2
import numpy as np
def nothing(x):
    pass
# 创建一副黑色图像
img=np.zeros((300,512,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
switch='0:OFF\n1:ON'
cv2.createTrackbar(switch,'image',0,1,nothing)
while(1):
    cv2.imshow('image',img)
    k=cv2.waitKey(1)&0xFF
    if k==27:
        break
    r=cv2.getTrackbarPos('R','image')
    g=cv2.getTrackbarPos('G','image')
    b=cv2.getTrackbarPos('B','image')
    s=cv2.getTrackbarPos(switch,'image')
    if s==0:
        img[:]=0
    else:
        img[:]=[b,g,r]
cv2.destroyAllWindows()

结果:

Opencv基本图像操作_第2张图片

3.像素替换、图片信息(9)

# -*- coding: utf-8 -*-
import cv2
import numpy as np
img=cv2.imread('png1.png')
img[1:20,:] =[0,0,255]
img[21:40,:]=[0,255,0]
img[41:60,:]=[255,0,0]
print (img[100,100])        #修改像素,图片显示三个带状颜色

print (img.item(10,10,2))
img.itemset((10,10,2),100)
print (img.item(10,10,2))

print (img.shape)   #获取像素行数/列数/通道数的函数,灰度图不返回第三个值
print (img.size)    #像素值=行数*列数*通道数
print (img.dtype)   #返回数据类型
'''******************************图片局部复制粘贴****************************'''
ball=img[280:340,330:390]
img[273:333,100:160] = ball

'''******************************通道拆分和合并****************************'''
#b,g,r=cv2.split(img)   #拆分(耗时)
#img=cv2.merge(b,g,r)
b=img[:,:,0]
g=img[:,0,:]
r=img[0,:,:]
#cv2.imshow('image',b)
#索引
#img[:,:,0]=0      
cv2.imshow('image',img)   #图片显示
cv2.waitKey(10000)

4.图片重叠与混合(10)

4.1透明混合

import cv2
import numpy as np
img1=cv2.imread('leimu1.jpg')
img2=cv2.imread('leimu2.jpg')
dst=cv2.addWeighted(img1,0.5,img2,0.5,0)
cv2.imshow('dst',dst)
cv2.waitKey(10000)
cv2.destroyAllWindows()

结果:(我老婆你们不要抢!)

4.2不透明混合

# -*- coding: utf-8 -*-
import cv2
import numpy as np
# 加载图像
img1=cv2.imread('leimu1.jpg')
img2=cv2.imread('leimu2.jpg')
# I want to put logo on top-left corner, So I create a ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# Now create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# Now black-out the area of logo in ROI
# 取roi 中与mask 中不为零的值对应的像素的值,其他值为0
# 注意这里必须有mask=mask 或者mask=mask_inv, 其中的mask= 不能忽略
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
# 取roi 中与mask_inv 中不为零的值对应的像素的值,其他值为0。
# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

5.几何变换(14)

5.1缩放

# -*- coding: utf-8 -*-
import cv2
import numpy as np
img=cv2.imread('leimu1.jpg')
# 下面的None 本应该是输出图像的尺寸,但是因为后边我们设置了缩放因子
# 因此这里为None
#res=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
#OR
# 这里呢,我们直接设置输出图像的尺寸,所以不用设置缩放因子
height,width=img.shape[:2]
#res=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
res=cv2.resize(img,(int(width/3),int(height/3)),interpolation=cv2.INTER_LINEAR)
while(1):
    cv2.imshow('res',res)
    cv2.imshow('img',img)
    if cv2.waitKey(1) & 0xFF == 27:
        break
cv2.destroyAllWindows()

5.2旋转

# -*- coding: utf-8 -*-
import cv2
import numpy as np
img=cv2.imread('leimu1.jpg',0)
rows,cols=img.shape
# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M=cv2.getRotationMatrix2D((cols/2,rows/2),90,0.5)
# 第三个参数是输出图像的尺寸中心
dst=cv2.warpAffine(img,M,(cols,rows))
while(1):
    cv2.imshow('img',dst)
    if cv2.waitKey(1)&0xFF==27:
        break
cv2.destroyAllWindows()

结果:

Opencv基本图像操作_第3张图片

5.3仿射变换

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
imgIn=cv2.imread('leimu1.jpg')
height,width=imgIn.shape[:2]
img=cv2.resize(imgIn,(int(width/3),int(height/3)),interpolation=cv2.INTER_LINEAR)

rows,cols,ch=img.shape
pts1=np.float32([[50,50],[200,50],[50,200]])   #变换前的三个点
pts2=np.float32([[100,100],[200,50],[100,250]])   #变换后的三个点
M=cv2.getAffineTransform(pts1,pts2)
dst=cv2.warpAffine(img,M,(cols,rows))

while(1):
    cv2.imshow('img',img)
    cv2.imshow('dst',dst)
    if cv2.waitKey(1)&0xFF==27:
        break
cv2.destroyAllWindows()

结果:

Opencv基本图像操作_第4张图片

5.4透射变换

确定对象范围,可以用后续的边界检测原理,这里用截图软件确定点坐标。

结果:(恭喜OMG)

Opencv基本图像操作_第5张图片

你可能感兴趣的:(opencv)