OpenCV 处理图像基本操作

《OpenCV入门指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764

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

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

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

importcv2.cvascv

# 读图片

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函数

importnumpyasnp

importcv2

img = cv2.imread('messi5.jpg',0)

cv2.imshow('image',img)

k = cv2.waitKey(0)

ifk ==27:# wait for ESC key to exit

    cv2.destroyAllWindows()

elifk == ord('s'):# wait for 's' key to save and exit

cv2.imwrite('messigray.png',img)

    cv2.destroyAllWindows()

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

importcv2

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. 获取图片属性

importcv2

img = cv2.imread('img/image.png')

printimg.shape

# (640, 640, 3)

printimg.size

# 1228800

printimg.dtype

# uint8

# 在debug的时候,dtype很重要

0x02. 输出文本

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

importcv2.cvascv

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 做图像处理的时候都是很常用的操作:

importcv2.cvascv

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:

importcv2

importnumpyasnp

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. 图像平移

importcv2

importnumpyasnp

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. 仿射变换

importcv2

importnumpyasnp

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:

importcv2.cvascv

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 。

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

importcv2

importnumpyasnp

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

ifk ==27:

break

cv2.destroyAllWindows()

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

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

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

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

cv2.cv

importcv2.cvascv

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

importcv2

img = cv2.imread('img/image.png')

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

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

0x09. 图片添加边距

cv2.copyMakeBorder函数

importcv2

importnumpyasnp

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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容