第三章:用opencv3处理图像

1、高通滤波器:高通滤波器会根据像素与周边像素的亮度差值来提升该像素的亮度的滤波器。

   低通滤波器:在像素与周围像素的亮度差小于一个特定值时,平滑该像素的亮度。

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

import cv2
import numpy as np
import os
img = cv2.imread(‘1.jpg‘,0)
cv2.imwrite(‘1_canny.jpg‘,cv2.Canny(img,200,300))
cv2.imshow(‘canny‘,cv2.imread(‘1_canny.jpg‘))
cv2.waitKey()
cv2.destroyAllWindows()

2做轮廓检测时,根据书中代码会出现以下错误,findContours()函数出现错误,查找资料发现这是因为python3的这个函数只返回两个参数,所以去掉image这个参数后,程序正常运行。

img = np.zeros((200, 200), dtype=np.uint8)
img[50:150, 50:150] = 255

ret, thresh = cv2.threshold(img, 127, 255, 0)
contours, hierarchy = 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()

3、找一个正方形轮廓很简单,但是要找不规则的、歪斜的以及旋转的形状可用cv2.finContours()函数:

img = cv2.pyrDown(cv2.imread("1.jpg", cv2.IMREAD_UNCHANGED))

ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY) , 127, 255, cv2.THRESH_BINARY)
contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for c in contours:
  x,y,w,h = cv2.boundingRect(c)
  cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2)
  rect = cv2.minAreaRect(c)
  box = cv2.boxPoints(rect)
  box = np.int0(box)
  cv2.drawContours(img, [box], 0, (0,0, 255), 3)
  (x,y),radius = cv2.minEnclosingCircle(c)
  center = (int(x),int(y))
  radius = int(radius)
  img = 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()

4、绘制直线函数为:cv2.line(img,Point pt1,Point pt2,color,thickness=1,line_type=8 shift=0)

from matplotlib import pyplot as plt
img = np.zeros((512,512),np.uint8)
cv2.line(img,(0,0),(511,511),255,10)
plt.imshow(img,‘gray‘)
plt.show()

img = np.zeros((512,512,3),np.uint8)
cv2.line(img,(0,0),(511,511),(0,0,255),10)
plt.imshow(img,‘brg‘)
plt.show()

5、HoughLinesP函数之所以成为概率版本的Hough变换是因为它只通过分析点的子集并估计这些点都属于一条直线的概率,这是标准Hough变换的优化版本,该函数的计算代价会少一些,执行会变得更快。

img = cv2.imread(‘3.png‘)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,120)
minLineLength = 20
maxLineGap = 5
lines = cv2.HoughLinesP(edges,1,np.pi/180,20,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imshow("edges", edges)
cv2.imshow("lines", img)
cv2.waitKey()
cv2.destroyAllWindows()

6、绘制圆

img = np.zeros((512,512,3),np.uint8)
cv2.circle(img,(300,300),50,(0,255,0),5)
plt.imshow(img,‘brg‘)
plt.show()

7、圆检测,HoughCircles函数可用来检测圆,它与使用HoughLines函数类似。像用来决定删除或保留直线的两个参数minLineLength和maxLineGap一样,HoughCircles有一个圆心间的最小距离和圆的最小及最大半径。

mario = cv2.imread(‘4.png‘)
gray_img = cv2.cvtColor(mario, 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 circle
    cv2.circle(mario,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(mario,(i[0],i[1]),2,(0,0,255),3)

cv2.imwrite("4_1.jpg", mario)
cv2.imshow("HoughCirlces", mario)
cv2.waitKey()
cv2.destroyAllWindows()

原文地址:https://www.cnblogs.com/roscangjie/p/10807732.html

时间: 2024-08-02 11:34:07

第三章:用opencv3处理图像的相关文章

[看书][CSS精粹(第2版)]第三章 CSS和图像 & HTML网页布局

本章主要讲述作为背景图像方面的技巧. 1.边框(添加边框样式.去除边框): 2.为页面设置背景图像,位置设定,固定背景图像: 3.为任意元素设置背景图像: 4.文字放在图像的上面(作为背景图像): 5.为文档添加多个背景图像(本例利用html和body元素产生多重背景图像的效果): 6.在页面中使用透明效果(使用PNG格式图像). 利用网络搜索补充学习了padding的4个方向顺序(上右下左 顺时针),流式布局(看网上的解释结合书里的描述,大概是指页内布局元素采用百分数指定位置和大小). [个人

【OPENGL】第三章 着色器基础(一)

在这一章,我们会学习什么是着色器(Shader),什么是着色器语言(OpenGL Shading Language-GLSL),以及着色器怎么和OpenGL程序交互. 首先我们先来看看什么叫着色器. Shader(着色器)是用来实现图像渲染的,用来替代固定渲染管线的可编程程序. 着色器替代了传统的固定渲染管线,可以实现3D图形学计算中的相关计算,由于其可编程性,可以实现各种各样的图像效果而不用受显卡的固定渲染管线限制.这极大的提高了图像的画质. 在上一篇文章( http://www.cnblog

Pro ASP.NET Core MVC 6th 第三章

第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解本章中讨论的一些想法和约定,特别是如果您已经完成了高级ASP.NET或C#开发. 如果没有,我鼓励你仔细阅读 - 深入地理解隐藏在MVC背后的东西可以帮助你在通读本书时更好地与MVC框架的功能联系起来. MVC的历史 模型视图控制器模式起源于20世纪70年代后期,来自施乐PARC的Smalltalk

第三章 Matlab的选择结构

第三章 Matlab的选择结构 3.1 程序编写的一般步骤 3.2 关系运算符 1) 0表示假,非0表示真: 2) ~=:不等于: 3) sin(pi) ~= 0:为1,比较a.b两个数是否相等方法:abs(a - b)<1.0e-14 3.3 逻辑运算 1) 先与&后或| 3.4 逻辑函数与短路运算 1) 短路运算:&&.||:非短路运算:&.| 2) ischar(x).isempty(x).isinf(x).isnan(x):是否不是数.isnumeric(x)

Android 渗透测试学习手册 第三章 Android 应用的逆向和审计

第三章 Android 应用的逆向和审计 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们将查看 Android 应用程序或.apk文件,并了解其不同的组件. 我们还将使用工具(如 Apktool,dex2jar 和 jd-gui)来逆向应用程序. 我们将进一步学习如何通过逆向和分析源代码来寻找 Android 应用程序中的各种漏洞. 我们还将使用一些静态分析工具和脚本来查找漏洞并利用它们. 3.1 Android 应用程序拆解 Android 应

Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧

Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用初探 Project面板 Stucture面板 Android Monitor Keymap Tip of the Day 快速查找 Search Action 演示模式 3.2 Android Studio使用进阶 操作与导航 快速重构 代码模板 内置模板 自定义代码注释模板 代码分析 在Andr

Jquery的一、二、三章的笔记

第一章:Jquery的基础 JQuery - 是一个JavaScript的框架(函数库) 一.Jquery的使用 1.下载Jquery框架:http://jquery.com 2.在页面引用jquery-x.x.x.js文件 <script type="text/javascript" src="js/jquery-1.7.2.js"></script> 3.使用 二.第一个Jquery程序$() $(document).ready(func

《计算机网络&amp;#183;自顶向下方法》第七版 第三章 课后习题与问题 答案

非官方答案,本人已尽最大努力(包括参考官方答案),使结果正确,如有错误,请大佬指出 正文: 3.1~3.3节 R1 a.如果只是简单想把信件送到,那么所有的头部信息只需要一个目的地址就够了,题目给出端口号四个字节,所有分组的头部那就只需四个字节 此协议规定,运输层的全部任务就是,将应用层的数据,切成最大1196字节的块,把每一块加上目的主机对应程序的端口号,并将得到的分组交付给网络层 在接收方,运输层将网络层报文取回,去掉头部信息,将数据拼接成应用层需要的信息,根据端口号交付给应用层即可 不过话

构建之法前三章读后感

一. 软件作为一个产品,在提供用户使用前经历了许多工序,我们用工程的方式将开发软件的工序,过程加以工程化,系统化.成立了一套完整的体系后,有利于帮助我们开发软件,乃至于大型的系统. 软件具有一定的特殊性,使得软件工程师们做开发提升了一定的难度,但软件工程有助于软件系统的开发,帮助工程师们设计,构建,测试和维护软件.所以,软件工程的最终目的是帮助工程师们创造“足够好”的软件,提高软件的质量,用户满意度,可靠性,可维护性等. 第一章问题:怎么才算是一个真正的软件工程师? 二.   一个优秀的软件,通

0320 《构建之法》前三章观后感

第一章.为我们解释什么是软件,什么是软件工程,读完这章对这些概念有一定的认识这章让我明白,代码不能盲目的敲,好的软件并非两三天,并非一两个人就能赶出来的,需要大家的精诚合作.同时,在编写程序之前,还需要做一系列的分析.设计,要满足客户的需求,后续还要对软件进行测试.维护等.在这之前,我一直觉得能把程序运行,能有正确的结果,那就完成任务了,可这只是整个软件流程的一部分而已.看了邹老师的书,才知道其实创新有很多的方面,除了技术,还有商业思路,差异化等等,这些都给了我很大的感触,作为一名程序员,我们不