opencv3编程入门_java基础与入门教程

opencv3编程入门_java基础与入门教程——韦访 201810111、概述想学习图像处理,不管是机器学习也好,深度学习也好,不会点OpenCV好像有点说不过去吧?所以,现在开始OpenCV的学习。2、读写图片先从图片的读写开始,opencv读取图片的函数是imread,默认情况下,imread函数返回BGR格式的图像,可以用imwrite函数将数据写到本地。下面的代码会将JPG图片转成PNG。import…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

——韦访 20181011

1、概述

想学习图像处理,不管是机器学习也好,深度学习也好,不会点OpenCV好像有点说不过去吧?所以,现在开始OpenCV的学习。

2、读写图片

先从图片的读写开始,opencv读取图片的函数是imread,默认情况下,imread函数返回BGR格式的图像,可以用imwrite函数将数据写到本地。下面的代码会将JPG图片转成PNG。

import cv2
image = cv2.imread('dog.jpeg')
cv2.imwrite('dog.png', image)

运行结果:

opencv3编程入门_java基础与入门教程

如果想将图片通过OpenCV的窗口显示,则调用imshow函数,注意在代码末尾加上waitkey函数,否则窗口就直接关闭了,不知道的还以为imshow函数没起作用。代码如下,

import cv2
image = cv2.imread('dog.jpeg')
cv2.imwrite('dog.png', image)
cv2.imshow('dog', image)
cv2.waitKey(0)

运行结果:

opencv3编程入门_java基础与入门教程

上面提到,imread默认返回的是BGR图片,我们也可以通过设置参数,让其返回一个灰度图片,代码如下,

import cv2
image = cv2.imread('dog.jpeg', flags=cv2.IMREAD_GRAYSCALE)
cv2.imshow('dog', image)
cv2.waitKey(0)

运行结果:

opencv3编程入门_java基础与入门教程

3、高通滤波器

高通滤波器(HPF)是检测图像的某个区域,根据该像素与周围像素的亮度差值来提升该像素的亮度的滤波器。下面来举个例子,代码如下,

import cv2
import numpy as np
from scipy import ndimage

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('sea.jpg', flags=cv2.IMREAD_GRAYSCALE)
k3 = ndimage.convolve(img, kernel_3x3)
k5 = ndimage.convolve(img, kernel_5x5)

GBlur = cv2.GaussianBlur(img, (11, 11), 0)
g_hpf = img - GBlur

cv2.imshow('img', img)
cv2.imshow('3x3', k3)
cv2.imshow('5x5', k5)
cv2.imshow('g_hpf', g_hpf)
cv2.waitKey()
cv2.destroyAllWindows()

opencv3编程入门_java基础与入门教程

4、低通滤波器

低通滤波器则在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度,主要用于去噪和模糊化。

 

5、边缘检测

边缘检测不管是在人类视觉还是计算机视觉中都是非常重要的,我们能识别物体,就是靠边缘。这个很容易理解,夜晚很黑什么都看不到,不就是因为没看到物体的边缘吗?

OpenCV提供了很多边缘检测的滤波函数,比如,Laplacian, Sobel, Scharr, Canny等。这些函数会将非边缘区域转为黑色,将边缘区域转为白色或其他颜色。但是,这些函数容易将噪声错误的失败为边缘,所以,在边缘检测之前,应该对图像进行模糊处理。

OpenCV提供了很多模糊滤波器,比如blur, medianBlur, GausianBlur等,边缘检测滤波器和模糊滤波器总有一个ksize参数,这个参数表示滤波核的宽高,是一个奇数。还是来个代码吧,

import cv2

img = cv2.imread('car.jpg', flags=cv2.IMREAD_GRAYSCALE)
GBlur = cv2.GaussianBlur(img, (3, 3), 0)
canny = cv2.Canny(GBlur, 50, 150)
cv2.imshow('img', img)
cv2.imshow('canny', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果,

opencv3编程入门_java基础与入门教程

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

实际应用中经常会对目标的边界框、最小矩形区域、最小闭圆特别感兴趣。用cv2.findContours函数很容易实现上述功能。上代码,

#encoding:utf-8
import cv2
import numpy as np

#读取图片
img = cv2.imread('Picture1.png', cv2.IMREAD_UNCHANGED)
#降低分辨率,也可以不降低
# img = cv2.pyrDown(img)

#对图像进行二值化操作
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_BINARY)

#检测轮廓,
#输入的三个参数分别为:输入图像、层次类型、轮廓逼近方法
#因为这个函数会修改输入图像,所以上面的步骤使用copy函数将原图像做一份拷贝,再处理
#返回的三个返回值分别为:修改后的图像、图轮廓、层次
image, 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, (255, 0, 0), 2)

cv2.imshow('image', image)
cv2.drawContours(img, contours, -1, (255, 0, 0), 1)
cv2.imshow("contours", img)
cv2.waitKey(0)

运行结果:

opencv3编程入门_java基础与入门教程

总结:

基础知识先学这么多,后续再通过实例慢慢学,本来想加上摄像头的操作,无奈电脑没有摄像头,已经在淘宝了,后续实例中再补了。

 

 

如果您感觉本篇博客对您有帮助,请打开支付宝,领个红包支持一下,祝您扫到99元,谢谢~~

opencv3编程入门_java基础与入门教程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/186518.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • java map转json字符_Map转JSON字符串

    java map转json字符_Map转JSON字符串[java]代码库packagecom.smartAnji.control.utils;importjava.util.HashMap;publicclassMessageUtil{publicfinalstaticStringTYPE=”type”;publicfinalstaticStringDATA=”data”;publicfinalstaticSt…

  • Silverlight学习网站[通俗易懂]

    Silverlight学习网站[通俗易懂]http://silverlight.cn/

    2022年10月10日
  • cpu周期与指令周期_cpu时钟周期数怎么计算

    cpu周期与指令周期_cpu时钟周期数怎么计算计算机中我们常常会混淆指令周期、CPU周期和时钟周期,要区分这些并不难,但要想彻底弄懂这些,就得要求我们对CPU底层有一定了解。一.指令周期指令周期:是指计算机从取指到指令执行完毕的时间计算机执行指令的过程可以分为以下三个步骤:Fetch(取指),也就是从PC寄存器里找到对应的指令地址,根据指令地址从内存里把具体的指令,加载到指令寄存器中,然后把PC寄存器自增,好在未来执行下一条指令。 Decode(译码),也就是根据指令寄存器里面的指令,解析成要进行什么样的操作,是R、I、J

    2022年10月12日
  • 小猪的Android入门之路 day 1

    小猪的Android入门之路 day 1

    2021年12月10日
  • markdown文本居中_markdown居中语法

    markdown文本居中_markdown居中语法示例表格序号偏移说明10表格说明22表格说明34表格说明实现的代码是下面这样的。<!–让表格居中显示的风格–><style>.center{width:auto;display:table;margin-left:auto;margin-right:auto;}</style><palign=”center”><fontfac..

  • Springboot自动装配原理_自动装配原理

    Springboot自动装配原理_自动装配原理springboot自动装配原理详解1)传统ssm整合redis的时候需要在xml的配置文件中进行大量的配置Bean我们在这里使用springboot来代替ssm的整合,只是通过xml的形式来整合redis第一步:加入配置<dependency><groupId>org.springframework.data</grou…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号