python图像处理opencv步骤是怎么样的

嵌入式设计应用

133人已加入

描述

  越来越觉得python是一强大的工具,处理样本确实不错。最近因项目需要涉及到图片处理,所以开始用python调用opencv,再次觉得python真乃神器也!

  一、主要函数

  1、 cv2.imread():读入图片,共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片,包括cv2.IMREAD_COLOR:读入一副彩色图片;cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道。

  2、cv2.imshow():创建一个窗口显示图片,共两个参数,第一个参数表示窗口名字,可以创建多个窗口中,但是每个窗口不能重名;第二个参数是读入的图片。

  3、cv2.waitKey():键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入。

  4、cv2.destroyAllWindows():删除建立的全部窗口。

  5、cv2.destroyWindows():删除指定的窗口。

  6、cv2.imwrite():保存图片,共两个参数,第一个为保存文件名,第二个为读入图片。

  Python-OpenCV 处理图像基本操作

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

  安装好 OpenCV 之后,首先尝试加载一张最简单的图片并显示出来,代码示例:

  第一种方式使用cv2.cv的LoadImage、ShowImage和SaveImage函数

  import cv2.cv as cv

  # 读图片

  image=cv.LoadImage(‘img/image.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

  也可以直接使用cv2的imread、imwrite和imshow函数

  import numpy as np

  import cv2

  img = cv2.imread(‘messi5.jpg’,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()

  imread函数还可以定义加载的mode,默认是以RGB模式处理图片:

  import cv2

  grayImage = cv2.imread(‘MyPic.png’, cv2.CV_LOAD_IMAGE_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(‘img/image.png’)

  print img.shape

  # (640, 640, 3)

  print img.size

  # 1228800

  print img.dtype

  # uint8

  # 在debug的时候,dtype很重要

  0x02. 输出文本

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

  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)

  cv2:

  cv2.putText(frame, ‘Hello World’, (300,100), 0, 0.5, (0,0,255),2)

  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

  cv2:

  import cv2

  import numpy as np

  img = cv2.imread(‘messi5.jpg’)

  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)

  0x04. 图像平移

  import cv2

  import numpy as np

  img = cv2.imread(‘messi5.jpg’,0)

  rows,cols = img.shape

  M = np.float32([[1,0,100],[0,1,50]])

  dst = cv2.warpAffine(img,M,(cols,rows))

  cv2.imshow(‘img’,dst)

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  0x05. 图像旋转

  img = cv2.imread(‘messi5.jpg’,0)

  rows,cols = img.shape

  M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)

  dst = cv2.warpAffine(img,M,(cols,rows))

  0x06. 仿射变换

  import cv2

  import numpy as np

  img = cv2.imread(‘mao.jpg’)

  rows,cols,ch = img.shape

  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)

  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(‘img/image.png’)

  b,g,r = cv2.split(img)

  img = cv2.merge((b,g,r))

  0x09. 图片添加边距

  cv2.copyMakeBorder函数

  import cv2

  import numpy as np

  BLUE = [255,0,0]

  img1 = cv2.imread(‘opencv_logo.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)

  python加opencv进行图像处理完整代码如下:

  [python] view plain copyimport os

  import re

  import sys

  import cv2

  from optparse import OptionParser

  import numpy as np

  def rotateImage(image, angel):#parameter angel in degrees

  height = image.shape[0]

  width = image.shape[1]

  ## height_big = height * 2

  ## width_big = width * 2

  height_big = height

  width_big = width

  image_big = cv2.resize(image, (width_big, height_big))

  image_center = (width_big/2, height_big/2)#rotation center

  ## rot_mat = cv2.getRotationMatrix2D(image_center,angel, 0.5)

  rot_mat = cv2.getRotationMatrix2D(image_center,angel, 1.0)

  result = cv2.warpAffine(image_big, rot_mat, (width_big, height_big), flags=cv2.INTER_LINEAR)

  return result

  filepath=‘E:\\data\\faceScrub2\\38743.jpg’

  ##im=cv2.imread(filepath,cv2.cv.CV_LOAD_IMAGE_COLOR)

  im=cv2.imread(filepath,cv2.cv.CV_LOAD_IMAGE_GRAYSCALE)

  im_rot=rotateImage(im,20)

  im_smooth=cv2.GaussianBlur(im,(3,3),3.0)

  ##im_flip=cv2.flip(im,0)

  im_flip1=cv2.flip(im,-1)

  im_flip2=cv2.flip(im,1)

  ##im_he=cv2.equalizeHist(im)

  ##cv2.imshow(‘test’,im)

  ##cv2.imshow(‘rotated’,im_rot)

  ##cv2.imshow(‘smooth’,im_smooth)

  ##cv2.imshow(‘f0’,im_flip)

  ##cv2.imshow(‘fn’,im_flip1)

  ##cv2.imshow(‘fp’,im_flip2)

  ##cv2.imshow(‘he’,im_he)

  cv2.imwrite(‘H:\\flipimg.jpg’,im_rot)

  ##cv2.waitKey(0)

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分