精华内容
下载资源
问答
  • Python-OpenCV 处理图像(五):图像中边界和轮廓检测 关于边缘检测的基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,就会看到极值的出现。 而在一阶导数为...

    Python-OpenCV 处理图像(五):图像中边界和轮廓检测

    关于边缘检测的基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,就会看到极值的出现。

    而在一阶导数为极值的地方,二阶导数为0,基于这个原理,就可以进行边缘检测。

    关于 Laplace 算法原理,可参考

    0x01. Laplace 算法

    下面的代码展示了分别对灰度化的图像和原始彩色图像中的边缘进行检测:

    [code]

     

    0x02. Sobel 算法

    Sobel 也是很常用的一种轮廓识别的算法。

    关于 Sobel 导数原理的介绍,可参考

    以下是使用 Sobel 算法进行轮廓检测的代码和效果

    [code]

     

    0x03. cv.MorphologyEx

    cv.MorphologyEx 是另外一种边缘检测的算法

    [code]

     

    0x04. Canny 边缘检测

    Canny 算法可以对直线边界做出很好的检测;

    关于 Canny 算法原理的描述,可参考:

    [code]

     

    0x05. 轮廓检测

    OpenCV 提供一个 FindContours 函数可以用来检测出图像中对象的轮廓:

    [code]

     

    0x06. 边界检测

     

     

     

    展开全文
  • Python-OpenCV 处理图像基本操作

    千次阅读 2017-09-13 09:10:40
    0x00. 图片读、写和显示操作 ...安装好 OpenCV 之后,首先尝试加载一张最简单的图片并显示出来,代码示例: 第一种方式使用cv2.cv的LoadImage、ShowImage和SaveImage函数 import cv2.cv as cv # 读图片

    转载自:https://segmentfault.com/a/1190000003742422#articleHeader3

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

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

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

    第一种方式使用cv2.cv的LoadImageShowImageSaveImage函数

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

    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)


    展开全文
  • 为了加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像。 0x00. 灰度图 灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。 灰度图像与...

    为了加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像。

    0x00. 灰度图

    灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。

    灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。

    在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值。

    0x01. 灰度化的方法

    1. 分量法

    将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。

    F1(i,j) = R(i,j) 
    F2(i,j) = G(i,j) 
    F3(i,j) = B(i,j)

    代码示例:

    import cv2.cv as cv
    image = cv.LoadImage('mao.jpg')
    b = cv.CreateImage(cv.GetSize(image), image.depth, 1)
    g = cv.CloneImage(b)
    r = cv.CloneImage(b)
        
    cv.Split(image, b, g, r, None)
    cv.ShowImage('a_window', r)
        
    cv.WaitKey(0)

    2. 最大值法

    将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。

    F(i,j) = max(R(i,j), G(i,j), B(i,j))

    代码示例:

    image = cv.LoadImage('mao.jpg')
    new = cv.CreateImage(cv.GetSize(image), image.depth, 1)
    for i in range(image.height):
        for j in range(image.width):
            new[i,j] = max(image[i,j][0], image[i,j][1], image[i,j][2])
    cv.ShowImage('a_window', new)
    cv.WaitKey(0)

    3.平均值法

    将彩色图像中的三分量亮度求平均得到一个灰度值。

    F(i,j) = (R(i,j) + G(i,j) + B(i,j)) / 3

    代码示例:

    image = cv.LoadImage('mao.jpg')
    new = cv.CreateImage(cv.GetSize(image), image.depth, 1)
    for i in range(image.height):
        for j in range(image.width):
            new[i,j] = (image[i,j][0] + image[i,j][1] + image[i,j][2])/3
    cv.ShowImage('a_window', new)
    cv.WaitKey(0)

    4.加权平均法

    根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。

    F(i,j) = 0.30R(i,j) + 0.59G(i,j) + 0.11B(i,j))

    代码示例:

    image = cv.LoadImage('mao.jpg')
    new = cv.CreateImage(cv.GetSize(image), image.depth, 1)
    for i in range(image.height):
        for j in range(image.width):
            new[i,j] = 0.3 * image[i,j][0] + 0.59 * image[i,j][1] +  0.11 * image[i,j][2]
    cv.ShowImage('a_window', new)
    cv.WaitKey(0)

    上面的公式可以看出绿色(G 分量)所占的比重比较大,所以有时候也会直接取G 分量进行灰度化。

    代码示例:

    image = cv.LoadImage('mao.jpg')
    new = cv.CreateImage(cv.GetSize(image), image.depth, 1)
    for i in range(image.height):
        for j in range(image.width):
            new[i,j] = image[i,j][1]
    cv.ShowImage('a_window', new)
    cv.WaitKey(0)

    内容来源:https://segmentfault.com/a/1190000003755100


    http://www.thinksaas.cn/topics/0/600/600540.html
    展开全文
  • 首先确保已经安装了Python Mac 下可以直接使用 brew 来安装OpenCV,具体步骤如下: # add opencv brew tap homebrew/science # install opencv brew install opencv 安装必要的python库 pip install ...
  • 0x00. 图片读、写和显示操作 安装好 OpenCV 之后,首先尝试加载一张最简单的图片并显示出来,代码示例: 第一种方式使用cv2.cv的LoadImage、ShowImage和SaveImage函数 import cv2.cv as cv # 读图片 image=c...
  • 0x01. 像素有两种直接操作图片像素点的方法:...第二种就是使用 OpenCV 提供的 Get1D、 Get2D 等函数。推荐使用第一种办法吧,毕竟简单。0x02. 获取行和列像素有一下四个函数:cv.GetCol(im, 0): 返回第一列的像素c...
  • 滤镜喜欢自拍的人肯定都知道滤镜了,下面代码尝试使用一些简单的滤镜,包括图片的平滑处理、灰度化、二值化等:import cv2.cv as cv image=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the ...
  • 安装好 OpenCV 之后,首先尝试加载一张最简单的图片并显示出来,代码示例: 第一种方式使用cv2.cv的LoadImage、ShowImage和SaveImage函数 import cv2.cv as cv # 读图片 image=cv.LoadImage('img/image.png', cv....
  • 特征识别这里主要用到两个函数:GoodFeaturesToTrack 和 extractSURFGoodFeaturesToTrack: 在图像中寻找具有大特征值的角点。SURF算法: 是一个稳健的图像识别和描述算法。总之这俩个我目前也不清楚能用来干嘛,...
  • 关于边缘检测的基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,就会看到极值的出现。...下面的代码展示了分别对灰度化的图像和原始彩色图像中的
  • 当我们想比较两张图片相似度的时候,可以使用这一节提到的技术 直方图对比 反向投影 关于这两种技术的原理可以参考我上面贴的链接,下面是示例的代码: ...转载自:http://python.jobbole.com/85257/
  • 原文出处: Tairy 系列文章目录0x01. 像素有两种直接操作图片像素点的方法...第二种就是使用 OpenCV 提供的 Get1D、 Get2D 等函数。推荐使用第一种办法吧,毕竟简单。0x02. 获取行和列像素有一下四个函数:cv.GetC...
  • 喜欢自拍的人肯定都知道滤镜了,下面代码尝试使用一些简单的滤镜,包括图片的平滑处理、灰度化、二值化等:   import cv2.cv as cv   image=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #...
  • 0x00. 图像二值化 ...图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。 0x01. 图像二值化处理 在将图像二值化之前需要将其先灰度化,示例代码:
  • 为了加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像。 0x00. 灰度图 灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。 灰度图像与黑白图像...
  • 关于边缘检测的基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,就... Laplace 算法下面的代码展示了分别对灰度化的图像和原始彩色图像中的边缘进行检测:imp...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,993
精华内容 1,197
关键字:

python-opencv处理图像

python 订阅