1,不同色彩空间的转换

OpenCV中有数百种关于在不同色彩空间之间转换的方法。当前,在计算机视觉中有三种常用的色彩空间:灰度、BGR以及HSV(Hue,Saturation,Value)。

色彩空间 详情
灰度 通过去除彩色信息来将其转换成灰阶,灰度色彩空间对中间处理特别有效,比如人脸检测。
BGR 即蓝-绿-红色彩空间,每一个像素点都由一个三元数组来表示,分别代表蓝、绿、红三种颜色。网页开发者可能熟悉另一个与之相似的颜色空间: RGB,它们只是在颜色的顺序上不同。
HSV H ( Hue)是色调,S ( Saturation) 是饱和度,V ( Value)表示黑暗的程度(或光谱另一端的明亮程度 )。

2,傅里叶变换

Joseph Fourier(约瑟夫·傅里叶)是一位18世纪的法国数学家,他认为一切都可以用波形来描述。简而言之:他观察到所有的波形都可以由一系列简单且频率不同的正弦曲线叠加得到。也就是说,人们所看到的波形都是由其他波形叠加而得到的。

图像的幅度谱是另–种图像,幅度谱图像呈现了原始图像在变化方面的一种表示:把一幅图像中最明亮的像素放到图像中央,然后逐渐变暗,在边缘上的像素最暗。这样可以发现图像中有多少亮的像素和暗的像素,以及它们分布的百分比。

2.1 高通滤波器

高通滤波器(HPF)是检测图像的某个区域,然后根据像素与周围像素的亮度差值来提升(boost)该像素的亮度的滤波器。
在计算完中央像素与周围邻近像素的亮度差值之和以后,如果亮度变化很大,中央像素的亮度会增加(反之则不会)。
换句话说,如果一个像素比它周围的像素更突出,就会提升它的亮度。

高通和低通滤波器都有一一个称为半径( radius)的属性,它决定了多大面积的邻近像素参与滤波运算。

是指一组权重的集合,它会应用在源图像的一个区域,并由此生成目标图像的一个像素。
比如,大小为7的核意味着每49 (7x7)个源图像的像素会产生目标图像的一个像素。
可把核看作一块覆盖在源图像上可移动的毛玻璃片,玻璃片覆盖区域的光线会按某种方式进行扩散混合后透过去。

import cv2
import numpy as np
from scipy import ndimage#这些滤波器种所有值加起来为0
kernel_3x3 = np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])kernel_5x5 = np.array([[-1,-1,-1,-1,-1],[-1,1,2,1,-1],[-1,2,4,2,-1],[-1,1,2,1,-1],[-1,-1,-1,-1,-1]])img = cv2.imread('result.jpg',0)k3 = ndimage.convolve(img,kernel_3x3)
k5 = ndimage.convolve(img,kernel_5x5)blurred = cv2.GaussianBlur(img,(11,11),0)
g_hpf = img - blurredcv2.imshow('3x3',k3)
cv2.imshow('5x5',k5)
cv2.imshow('g_hpg',g_hpf)
cv2.waitKey()
cv2.destroyAllWindows()

原图:
运行结果:

2.2 低通滤波器

高通滤波器是根据像素与邻近像素的亮度差值来提升该像素的亮度。
低通滤波器(LowPass Filter, LPF)则是在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度。
它主要用于去噪和模糊化,比如说,高斯模糊是最常用的模糊滤波器(平滑滤波器)之一,它是一个削弱高频信号强度的低通滤波器。

2.7 Canny边缘检测

Canny边缘检测算法非常复杂,但也很有趣:它有5个步骤,
使用高斯滤波器对图像进行去噪计算梯度在边缘上使用非最大抑制(NMS)在检测到的边缘上使用双( double)阈值去除假阳性( false positive),最后还会分析所有的边缘及其之间的连接,以保留真正的边缘并消除不明显的边缘

import cv2
import numpy as npimg = cv2.imread("result.jpg",0)
cv2.imwrite("canny.jpg",cv2.Canny(img,200,300))
cv2.imshow("canny",cv2.imread("canny.jpg"))
cv2.waitKey()
cv2.destroyAllWindows()

原图:

运行结果:

2.8 轮廓检测

这段代码首先创建了一个200 x 200大小的黑色空白图像,接着在图像的中央放置一个白色方块,这里用到了np数组在切片上赋值的功能。接下来对图像进行二值化操作,然后调用了findContours()函数。该函数有三个参数:输人图像、层次类型和轮廓逼近方法。它有几个方面特别有趣:

这个函数会修改输人图像,因此建议使用原始图像的-份拷贝 (比如说,通过img.copy()来作为输人图像)。
由函数返回的层次树相当重要:cv2.RETR_TREE参数会得到图像中轮廓的整体层次结构,以此来建立轮廓之间的“关系”。
如果只想得到最外面的轮廓,可使用cv2.RETR_ EXTERNAL。这对消除包含在其他轮廓中的轮廓很有用(比如,在大多数情形下,不需要检测一个目标包含在另一个与之相同的目标里面)。

findContours()函数有三个返回值:修改后的图像、图像的轮廓以及它们的层次。
用轮廓来画出图像的彩色版本(即把轮廓画成绿色),并显示出来。所得的结果是一个边缘为绿色的白色方块。

import cv2
import numpy as npimg = np.zeros((200,200),dtype=np.uint8)
img[50:150,50:150] = 255ret,thresh = cv2.threshold(img,127,255,0)
image,contours,hieraerchy  = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
color = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
img = cv2.drawContours(color,contours,-1,(0,255,0),2)
cv2.imshow('contours',color)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

2.9 边界框、最小矩形区域和最小闭圆的轮廓

import cv2
import numpy as npimg = cv2.pyrDown(cv2.imread('sq.jpg',cv2.IMREAD_UNCHANGED))ret,thresh = cv2.threshold(cv2.cvtColor(img.copy(),cv2.COLOR_BGR2GRAY),127,255,cv2.THRESH_BINARY)
image,contours,hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for c in contours:#find bounding box coordinatesx,y,w,h = cv2.boundingRect(c)cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)#find minimum arearect = cv2.minAreaRect(c)#calculate coordinates of the minimum area rectanglebox = cv2.boxPoints(rect)#normalize coordinates to integersbox = np.int0(box)#draw contourscv2.drawContours(img,[box],0,(0,0,255),3)#calculate center and radius of minimum enclosing circle(x,y),radius = cv2.minEnclosingCircle(c)#cast to integerscenter = (int(x),int(y))radius = int(radius)#draw the circleimg = cv2.circle(img,center,radius,(0,255,0),2)cv2.drawContours(img,contours,-1,(255,0,0),1)
cv2.imshow("contours",img)
cv2.waitKey()
cv2.destroyAllWindows()

原图:
运行结果:

2.10 凸轮廓与Douglas-Peucker算法

cv2.approxPloyDP(cnt,epsion,True)
参数一:轮廓
参数二:ε值,表示源轮廓与近似多边形的最大差值(这个值越小,近似多边形与源轮廓周长之间的最大差值,这个差值越小,近似多边形与源轮廓就越相似)
参数三:布尔标记,表示这个多边形是否闭合

cv2.convexHull(cnt)获取处理过的轮廓信息

2.11 直线和圆检测

2.11.1 直线检测

2.11.2 圆检测

import cv2
import numpy as npplanets = cv2.imread('result.jpg')
gray_img = cv2.cvtColor(planets,cv2.COLOR_BGR2GRAY)
img = cv2.medianBlur(gray_img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120,param1=100,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))for i in circles[0,:]:#draw the outer circlecv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)#draw the center of the circlecv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)cv2.imwrite("planets.jpg",planets)
cv2.imshow("HoughCircles",planets)
cv2.waitKey()
cv2.destroyAllWindows()

原图:
运行结果:

使用OpenCV3处理图像相关推荐

  1. 【OpenCV3】图像最大轮廓检测——cvFindBiggestContour()封装

    此前在<[OpenCV3]图像轮廓查找与绘制--cv::findContours()与cv::drawContours()详解>一文中,详细介绍了图像轮廓的检测与绘制,但是在实际的应用中, ...

  2. 【OpenCV3】图像通道分离与合并——cv::split()与cv::merge()详解

    在图像处理中,尤其是处理多通道图像时,有时需要对各个通道进行分离,分别处理:有时还需要对分离处理后的各个通道进行合并,重新合并成一个多通道的图像.opencv2和opencv3中实现图像通道的合并与分 ...

  3. 【OpenCV3】图像旋转与平移——cv::warpAffine()详解

    图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的. 1.图像的旋转 图像的旋转具体实现分为两步: ...

  4. 【OpenCV3】图像的读取、显示与保存

    OpenCV3和OpenCV2大同小异,图片的读取,通过函数cv::imread()来实现的:显示通过函数cv::imshow()来实现:而保存则通过cv::imwrite()来实现. 1.图片的读取 ...

  5. 【OpenCV3】图像翻转——cv::flip()详解

    在opencv2和opencv中,cv::flip()支持图像的翻转(上下翻转.左右翻转,以及同时均可). 具体调用形式如下: void cv::flip(cv::InputArray src, // ...

  6. OpenCV3之——图像对比度,亮度调整

    首先了解一下算子的概念,一般的图像处理算子都是一个函数,它接受一个或多个输入图像,并产生输出图像.下面是算子的一般形式: g(x) = h( f(x) )  或者  g(x) = h( f0(x)·· ...

  7. opencv3/C++图像边缘提取canny算子与Sobel算子实现opencv(VS2019 C++)

    Canny Detector 是一种针对快速实时边缘检测而优化的多阶段算法,该算法的基本目标是检测亮度(大梯度)的急剧变化,例如从白色到黑色的转换,在给定一组阈值的情况下将它们定义为边缘 opencv ...

  8. OpenCV3之——图像修补inpaint()函数

    #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace c ...

  9. Python 读取图像方式总结

    读取并显示图像 opencv3库 scikit-image库 PIL库 读取图像结果分析 打印图像信息 skimage获取图像信息 PIL获取图像信息 读取并显示图像方法总结 PIL库读取图像 Ope ...

最新文章

  1. 代码块练习题:看代码写程序的执行结果。
  2. 《降级论》《按时交作业的学生何以常穿脏袜子》读后感
  3. 【更新链接】U盘启动制作工具(UDTOOL) v3.0.2014.0427
  4. Python多任务(2.线程的概念以及组成(创建线程的两种方式))
  5. 支持分布式数据库同步操作的一个设计点:主键问题
  6. 如何在Windows 10的地图应用程序中获取离线地图
  7. MySQL查询指定日期时间语句大全
  8. Java 金额转换 阿拉伯数字金额转换成汉字大写金额
  9. 排序——归并(合二为一)
  10. 【从零开始学深度学习编译器】十五,MLIR Toy Tutorials学习笔记之Lowering到LLVM IR
  11. html5游戏 美术,cocos2d-html5游戏学习之绘画小熊
  12. 实训报告万能模板计算机专业,计算机专业实习报告模板
  13. bert获得词向量_Bert输入输出是什么
  14. AXI - 4KB边界
  15. potplayer怎么看直播_potplayer看直播的方法
  16. 10个顶级Python实用库,推荐你试试!
  17. 一套免费开源Java充电桩平台
  18. android data 加密默认关闭
  19. CSAPP:bufbomb实验
  20. PS/LR滤镜校正工具perfectly clear3破解版

热门文章

  1. 111邮箱服务器设置,如何设置Outlook邮箱帐号
  2. linux 查看libusb版本,linux / libusb获取usb设备路径
  3. 移动端UC /QQ 浏览器的部分私有Meta 属性
  4. Raect Router 4 的使用 (1)
  5. 网页中二维码识别规则
  6. Async Await
  7. idea+maven+ssm搭建boot_crm项目遇到的问题
  8. Leetcode 648.单词替换
  9. MySQL(介绍,安装,密码操作,权限表)
  10. 判断字符串是否为正整数 浮点小数