opencv-图像处理1 图像基本操作

参考:

0https://segmentfault.com/a/1190000003742481 #基础教程

1、http://docs.opencv.org/3.3.0/  官方文档api

2、http://docs.opencv.org/3.3.0/d6/d00/tutorial_py_root.html 官方英文教程

3、https://github.com/makelove/OpenCV-Python-Tutorial# 进阶教程

4、https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html

5、https://docs.opencv.org/3.3.0/index.html  官方英文教程

6、https://github.com/abidrahmank/OpenCV2-Python-Tutorials

7、https://www.learnopencv.com/

8、http://answers.opencv.org/questions/ OpenCV论坛


注:安装的版本 opencv_python-3.3.0-cp36-cp36m-win_amd64.whl



Python-OpenCV 处理图像(一):基本操作

0x00. 图片读、写和显示操作


1、使用cv2.cv的LoadImageShowImageSaveImage函数

import cv2.cv as cv

# 读图片
image=cv.LoadImage('Lenna.png', cv.CV_LOAD_IMAGE_COLOR)#Load the image
#Or just: image=cv.LoadImage('img/image.png')

cv.NamedWindow('a_window', cv.CV_WINDOW_AUTOSIZE) #Facultative
cv.ShowImage('a_window', image) #Show the image

# 写图片
cv.SaveImage("thumb.png", thumb)
cv.WaitKey(0) #Wait for user input and quit
:v3 版本 导入 import cv2.cv as cv 会报错 ; v2 版本可以正常运行


2、直接使用cv2的imreadimwriteimshow函数

import numpy as np
import cv2

# imread函数还可以定义加载的mode,默认是以RGB模式处理图片:
# 0 表示会以灰度图加载
img = cv2.imread('Lenna.png',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows() # 退出
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('messigray.png',img) # 保存图像
    cv2.destroyAllWindows() # 退出

cv2.IMREAD_GRAYSCALE 转成灰度图像

import cv2
grayImage = cv2.imread('Lenna.png', cv2.IMREAD_GRAYSCALE)  # CV_LOAD_IMAGE_GRAYSCALE-->IMREAD_GRAYSCALE
# 可选参数CV_LOAD_IMAGE_COLOR (BGR), CV_LOAD_IMAGE_GRAYSCALE (grayscale), CV_LOAD_IMAGE_UNCHANGED(neither)
cv2.imwrite('MyPicGray.png', grayImage)

0x01. 获取图片属性

import cv2
img = cv2.imread('Lenna.png')
print (img.shape)
# (512, 512, 3)
print (img.size)
# 786432
print (img.dtype)
# uint8
# debug的时候,dtype很重要


0x02. 输出文本


在处理图片的时候,我们经常会需要把一些信息直接以文字的形式输出在图片上,下面的代码将实现这个效果:

注:v3版本 使用以下语句会出错

import cv2.cv as cv

image=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the image

font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 3, 8) #Creates a font

y = image.height / 2 # y position of the text
x = image.width / 4 # x position of the text

cv.PutText(image,"Hello World !", (x,y),font, cv.RGB(255, 255, 255)) #Draw the text

cv.ShowImage('Hello World', image) #Show the image

cv.WaitKey(0)

改成对应的v3 版本

# import cv2.cv as cv
import cv2

# image=cv.LoadImage('lenna.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the image
image=cv2.imread('lenna.png',cv2.IMREAD_COLOR)

# font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 3, 8) #Creates a font
font=cv2.FONT_HERSHEY_COMPLEX

# y = image.height / 2 # y position of the text
y=image.shape[0]//2
# x = image.width / 4 # x position of the text
x=image.shape[1]//4

# cv.PutText(image,"Hello World !", (x,y),font, cv.RGB(255, 255, 255)) #Draw the text
cv2.putText(image, 'Hello World', (x,y), font, 0.5, (0,0,255),2)

# cv.ShowImage('Hello World', image) #Show the image
cv2.imshow('Hello World',image)

# cv.WaitKey(0)
cv2.waitKey(0)

0x03. 缩放图片


下面的例子将实现缩放图片并保存,这个在使用 OpenCV 做图像处理的时候都是很常用的操作:

import cv2.cv as cv

im = cv.LoadImage("img/alkaline.jpg") #get the image

thumb = cv.CreateImage((im.width / 2, im.height / 2), 8, 3) #Create an image that is twice smaller than the original

cv.Resize(im, thumb) #resize the original image into thumb
#cv.PyrDown(im, thumb)

cv.SaveImage("thumb.png", thumb) # save the thumb image
:v3 版本 导入import cv2.cv as cv 会报错 ; v2 版本可以正常运行


import cv2
import numpy as np
img = cv2.imread('lenna.png')
# 图像的宽度和高度都放大2倍,cv2.INTER_AREA为插值方式
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_AREA) 
cv2.imshow('1',res)
#OR

height, width = img.shape[:2]
# 图像的宽度和高度都放大2倍,cv2.INTER_CUBIC为插值方式
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC) #

cv2.imshow('2',res)

cv2.waitKey(0)

0x04. 图像平移

import cv2
import numpy as np

img = cv2.imread('lenna.png',0) #  cv2.imread('lenna.png',cv2.IMREAD_GRAYSCALE)
rows,cols = img.shape # [h,w,c]

M = np.float32([[1,0,100],[0,1,50]]) # 2×3 transformation matrix.
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

0x05. 图像旋转

import cv2
import numpy as np

img = cv2.imread('lenna.png',0) #  cv2.imread('lenna.png',cv2.IMREAD_GRAYSCALE)
rows,cols = img.shape # [h,w,c]

M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1) # 以图像中心为原点逆时针旋转90度,1表示保持原来的比例
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()


0x06. 仿射变换

import cv2
import numpy as np

img = cv2.imread('lenna.png')
rows,cols,ch = img.shape # [h,w,c]

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))

cv2.imshow('image',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

0x07. 图像颜色变换

实际使用过程中,我们经常也需要对一些图片的颜色空间做一些改变之类的:

c2.cv:

import cv2.cv as cv
im=cv.LoadImage('img/fruits.jpg',cv.CV_LOAD_IMAGE_COLOR)
res = cv.CreateImage(cv.GetSize(im), cv.CV_8UC2, 3) #cv.CV_32F, cv.IPL_DEPTH_16S, ...
cv.Convert(im, res) 
cv.ShowImage("Converted",res)
res2 = cv.CreateImage(cv.GetSize(im), cv.CV_8UC2, 3)
cv.CvtColor(im, res2, cv.CV_RGB2BGR) # HLS, HSV, YCrCb, ....
cv.ShowImage("CvtColor", res2)
cv.WaitKey(0)
  • cv.Convert():将图片从一个颜色空间转到另一个颜色空间

  • cv.CvtColor(src, dst, code):

cv2:

cv2.cvtColor(input_image, flag)函数实现图片颜色空间的转换,flag 参数决定变换类型。如 BGR->Gray flag 就可以设置为 cv2.COLOR_BGR2GRAY 。

一个简单的例子,下面的代码实现识别摄像视频中蓝色的部分:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # 读取视频的每一帧
    _, frame = cap.read()

    # 将图片从 BGR 空间转换到 HSV 空间
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 定义在HSV空间中蓝色的范围
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # 根据以上定义的蓝色的阈值得到蓝色的部分
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()
以上的代码给出了视频中获取兴趣对象的基本思想。


0x08. 通道的拆分/合并处理

对于一张图片的 R、G、B 通道,我们可以很方便的使用 OpenCV 获取并分离或者合并:

(这是将图像灰度化处理的一种方式)

cv2.cv

import cv2.cv as cv

orig = cv.LoadImage('img/fruits.jpg')
b = cv.CreateImage(cv.GetSize(orig), orig.depth, 1)
g = cv.CloneImage(b)
r = cv.CloneImage(b)
cv.Split(orig, b, g, r, None)

merged = cv.CreateImage(cv.GetSize(orig), 8, 3)
cv.Merge(g, b, r, None, merged)

cv.ShowImage("Image", orig)
cv.ShowImage("Blue", b)
cv.ShowImage("Green", g)
cv.ShowImage("Red", r)
cv.ShowImage("Merged", merged)

cv.WaitKey(0)

cv2

import cv2

img = cv2.imread('lenna.png')
b,g,r = cv2.split(img)
merged = cv2.merge((b,g,r))

cv2.imshow("Image", img)
cv2.imshow("Blue", b)
cv2.imshow("Green", g)
cv2.imshow("Red", r)
cv2.imshow("Merged", merged)

# cv2.waitKey(0)
k = cv2.waitKey(0) & 0xFF
if k == 27: # Esc     cv2.destroyAllWindows()


0x09. 图片添加边距

cv2.copyMakeBorder函数

import cv2
import numpy as np

BLUE = [255,0,0] # [B ,G ,R]

img1 = cv2.imread('lenna.png')

replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)

cv2.imshow("Image", img1)
cv2.imshow("replicate", replicate)
cv2.imshow("reflect", reflect)
cv2.imshow("reflect101", reflect101)
cv2.imshow("wrap", wrap)
cv2.imshow("constant", constant)

# cv2.waitKey(0)
k = cv2.waitKey(0) & 0xFF
if k == 27: # Esc     cv2.destroyAllWindows()



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值