技术文章
当前位置:首页 > Python技术文章 > Python Opencv检测并绘制框图

Python Opencv任意形状目标检测并绘制框图实例

  • 发布时间:
  • 作者:码农之家原创
  • 点击:171

这篇文章主要知识点是关于Python、Opencv、任意形状、绘制框图、python OpenCV学习笔记之绘制直方图的方法 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Python基础教程
Python基础教程完整第3版
  • 类型:Python3.5编程大小:10.1 MB格式:PDF出版:人民邮电出版社作者:芒努斯·利·海特兰
立即下载

更多Python相关的学习资源可以参阅 Python电子书程序设计电子书 等栏目。

Python Opencv检测并绘制框图

opencv 进行任意形状目标识别,供大家参考,具体内容如下

工作中有一次需要在简单的图上进行目标识别,目标的形状不固定,并且存在一定程度上的噪声影响,但是噪声影响不确定。这是一个简单的事情,因为图像并不复杂,现在将代码公布如下:

 

import cv2


def otsu_seg(img):

  ret_th, bin_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

  return ret_th, bin_img

def find_pole(bin_img):
  img, contours, hierarchy = cv2.findContours(bin_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  area = 0
  for i in range(len(contours)):
    area += cv2.contourArea(contours[i])
  area_mean = area / len(contours)
  mark = []
  for i in range(len(contours)):
    if cv2.contourArea(contours[i]) < area_mean:
      mark.append(i)

  return img, contours, hierarchy, mark

def draw_box(img,contours):
  img = cv2.rectangle(img,
         (contours[0][0], contours[0][1]),
         (contours[1][0], contours[1][1]),
         (255,255,255),
         3)
  return img

def main(img):
  ret, th = otsu_seg(img)
  img_new, contours, hierarchy, mark = find_pole(th)
  for i in range(len(contours)):
    if i not in mark:
      left_point = contours[i].min(axis=1).min(axis=0)
      right_point = contours[i].max(axis=1).max(axis=0)
      img = draw_box(img, (left_point, right_point))
  return img


if __name__ =="__main__":
  img = cv2.imread('G:/test.png')
  img = main(img)
  cv2.imwrite('G:/test_d.png', img)

Python Opencv任意形状目标检测并绘制框图

结果图如下:

Python Opencv任意形状目标检测并绘制框图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

python OpenCV学习笔记之绘制直方图的方法

本篇文章主要介绍了python OpenCV学习笔记之绘制直方图的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

官方文档 – https://docs.opencv.org/3.4.0/d1/db7/tutorial_py_histogram_begins.html

直方图会让你对图像的强度分布有一个全面的认识。它是一个在x轴上带有像素值(从0到255,但不总是),在y轴上的图像中对应的像素数量的图。

这只是理解图像的另一种方式。通过观察图像的直方图,你可以直观地看到图像的对比度、亮度、强度分布等。现在几乎所有的图像处理工具都提供了直方图的特性。下面是剑桥彩色网站的图片,建议去访问这个网站,了解更多细节。

python OpenCV学习笔记之绘制直方图的方法

你可以看到图像和它的直方图。(这个直方图是用灰度图像绘制的,而不是彩色图像)。直方图的左边部分显示了图像中较暗像素的数量,右边区域显示了更明亮的像素。从直方图中可以看到,深色区域的像素数量比亮色区域更多,而中间色调的数量(中值大约在127左右)则少得多。

直方图

现在我们已经知道了什么是直方图,我们可以看看如何找到它。OpenCV和Numpy都有内置的功能。在使用这些函数之前,我们需要了解一些与直方图相关的术语。

BINS:上面的直方图显示了每个像素值的像素数,从0到255。您需要256个值来显示以上的直方图。但是,考虑一下,如果您不需要单独查找所有像素值的像素数量,而是在一个像素值区间内的像素数量,该怎么办?例如,你需要找到介于0到15之间的像素数,然后是16到31……240到255。您只需要16个值来表示这个直方图。OpenCV Tutorials on histograms中展示了这个例子。

所以你要做的就是把整个直方图分成16个子部分,每个子部分的值是所有像素数的和。每个子部分都被称为“BIN”。在第一种情况下,BINS的数量是256(每个像素一个),而在第二种情况下,它只有16个。在OpenCV文档中,用术语 histSize 表示 BINS。

DIMS:它是我们收集数据的参数的个数。在这种情况下,我们收集的数据只有一件事,强度值。所以这里是1。

RANGE:它是你想测量的强度值的范围。通常,它是 [ 0,256 ],也就是所有的强度值。

OpenCV中直方图的计算

现在我们使用cv.calcHist()函数来找到直方图。让我们熟悉一下这个函数及其参数:
cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

images:它是uint8类型或float32的源图像。它应该用方括号括起来,也就是”[img]”。

channels:它也用方括号括起来。它是我们计算直方图的信道的索引。例如,如果输入是灰度图像,它的值是0。对于颜色图像,您可以通过0、1或2来分别计算蓝色、绿色或红色通道的直方图。

mask:遮罩图。为了找到完整图像的直方图,它被指定为“None”。但如果你想找到图像的特定区域的直方图,你必须为它创建一个遮罩图,并将其作为遮罩。

histSize:这代表了我们的BINS数。需要用方括号来表示。在整个范围内,我们通过了256。

ranges:强度值范围,通常是 [ 0,256 ]

让我们从一个样本图像开始。只需在灰度模式下加载图像并找到其完整的直方图。

img = cv.imread('home.jpg', 0)
hist = cv.calcHist([img], [0], None, [256], [0,256])

hist是一个256x1阵列,每个值对应于该图像中的像素值及其对应的像素值。

Numpy中直方图的计算

Numpy中提供了np.histogram()方法

hist, bins = np.histogram(img.ravel(), 356, [0,256])

hist和之前计算的一样。但是bins有257个元素,因为Numpy计算bins是以0-0.99,1-1.99等,所以最后一个是255-255.99。为了表示这一点,他们还在bins的末端添加了256。但我们不需要256。到255就足够了。

Numpy还有另一个函数,np.bincount(),比np.histograme()要快得多(大约10X)。对于一维直方图,你可以试一下。不要忘记在np.bincount中设置minlength=256。例如,hist=np.bincount(img.ravel(),minlength=256)

OpenCV函数比np.histogram()快(大约40X)。所以坚持用OpenCV函数。

绘制直方图

1、使用Matplotlib

Matplotlib有一个绘制直方图的函数:matplotlib.pyplot.hist()

它直接找到了直方图并绘制了它。您不需要使用calcHist()np.histogram()函数来找到直方图。看下面的代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('home.jpg', 0)
plt.hist(img.ravel(), 256, [0,256])
plt.show()

python OpenCV学习笔记之绘制直方图的方法

或者你可以用正常的matplotlib,这对BGR的情节很有帮助。为此,您需要首先找到直方图数据。试试下面的代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('home.jpg')
color = ('b', 'g', 'r')
for i, col in enumerate(color):
  histr = cv.calcHist([img], [i], None, [256], [0,256])
  plt.plot(histr, color=col)
  plt.xlim([0,256])
plt.show()

python OpenCV学习笔记之绘制直方图的方法 

你可以从上面的图中扣除,蓝色在图像中有一些高值区域(很明显,它应该是由天空引起的)

2、使用OpenCV

这里,你可以调整直方图的值和它的bin值,让它看起来像x,y坐标,这样你就可以用cv.line()或cv.polyline()函数来绘制它,从而生成与上面相同的图像。这已经是OpenCV-Python2官方的样本了。检查sampl/python/hist.py的代码。

应用遮罩

我们用cv.calcHist()函数来找一张完整的图片的直方图。但是我们只要图片的一部分的直方图呢?在你想要找到的区域中,创建一个带有白色的遮罩图像。然后把它作为遮罩。

img = cv.imread('home.jpg', 0)

# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv.bitwise_and(img, img, mask=mask)

#Calculate histogram with mask and without mask
Check third argument for mask
hist_full = cv.calcHist([img], [0], None, [256], [0,256])
hist_mask = cv.calcHist([img], [0], mask, [256], [0,256])

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask,'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])

plt.show()

蓝线表示完整图片的直方图

绿线表示遮罩之后的直方图

python OpenCV学习笔记之绘制直方图的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于Python的全部知识点内容总结,大家还可以在下方相关文章里找到实例讲解python MNIST手写识、 python字符串和常见数据结、 如何由java转学python、 等python文章进一步学习,感谢大家的阅读和支持。

上一篇:python使用flask与js进行前后台交互的实现方法详解

下一篇:Python实现手机短信监控通知的实例讲解

展开 +

收起 -

相关电子书
学习笔记
网友NO.212115

OpenCV2.3.1+Python2.7.3+Numpy等的配置解析

最近自己准备学习Python,之前也看了点基础知识。做图形这块需要用到OpenCV所以就需要配置环境,之前准备用的是Python3,后来发现好多python貌似并不兼容Python3,所以就装了2.7.3。 我的机子是64位的win7,用的是python2.7.3,OpenCV用的是2.3.1,网上参照了好多发现根本不能用,以下自己亲测可以。 常用的科学计算包有numpy、scipy、,matplotlib、pandas等,需要一个一个装,这里有一个解决方法就是装EPD或者是Python(x,y),我装的是EPD,它就将好多种python科学计算库一起打包装好,比较方便。 (1)将EPD装起来,python路径默认就可以 (2)将pandas装起来,默认点击就可以了 (3)安装OpenCV,它会自己默认在本文件夹下抽取出目录,大概是像这样的: 进入opencv–build–python,将2.7目录下的东西拷贝,就是这个 把东西拷贝到python的安装目录,默认是C:\python27下的Lib–site-……

网友NO.637231

Python opencv实现人眼/人脸识别以及实时打码处理

利用Python+opencv实现从摄像头捕获图像,识别其中的人眼/人脸,并打上马赛克。 系统环境:Windows 7 + Python 3.6.3 + opencv 3.4.2 一、系统、资源准备 要想达成该目标,需要满足一下几个条件: 找一台带有摄像头的电脑,一般笔记本即可; 需配有Python3,并安装NumPy包、opencv; 需要有已经训练好的分类器,用于识别视频中的人脸、人眼等,如无分类器,可以点击这里下载:haarcascades分类器 二、动手做 1、导入相关包、设置视频格式、调用摄像头、指定分类器 import numpy as np import cv2 fourcc = cv2.VideoWriter_fourcc("D", "I", "B", " ")out = cv2.VideoWriter('frame_mosic.MP4',fourcc, 20.0, (640,480)) cv2.namedWindow("CaptureFace")#调用摄像头cap=cv2.VideoCapture(0)#人眼识别器分类器classfier=cv2.CascadeClassifier("../haarcascades/haarcascade_eye_tree_eyeglasses.xml") 2、逐帧调用图像,并实时处理 从摄像头读取一帧图像后,……

网友NO.175833

python+opencv轮廓检测代码解析

首先大家可以对OpenCV有个初步的了解,可以参考:简单了解OpenCV 轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线。检测轮廓的工作对形状分析和物体检测与识别都非常有用。 在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测。在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点。 import cv2 #读入图片 img = cv2.imread("1.png") # 必须先转化成灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINAEY) # 寻找轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 画出轮廓,-1,表示所有轮廓,画笔颜色为(0, 255, 0),即Green,粗细为3 cv2.drawContours(img, contours, -1, (0, 255, 0), 3) # 显示图片 cv2.namedWindow("Contours", cv2.NORMAL_WINDOW) cv2.imshow("Contour……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明