opencv 教程2 画图操作 阈值操作 像素操作与或非 图像掩膜操作 图像融合

标签: opencv python  opencv  图像识别  计算机视觉  cv

opencv 教程2 画图操作 阈值操作 像素操作与或非 图像掩膜操作 图像融合

1.画图操作:
1)画多边形

import  cv2 as cv
import  numpy as np
img=np.zeros((400,400,3))        #黑色背景
pts=np.array([[100,200],[200,250],[250,300],[300,380]])#各个顶点
cv.polylines(img,[pts],1,(0,255,0),thickness=3)#画图
cv.imshow("lines",img)
cv.waitKey(0)

results:在这里插入图片描述
2)写字

src=cv.imread('D:/731.png')
font=cv.FONT_HERSHEY_COMPLEX
cv.putText(src,'hello,python',(100,100),font,1,(0,255,0),5)
cv.imshow("wenzi",src)
cv.waitKey(0)

在这里插入图片描述
2.各种阈值操作
1)理解二值化
2)OTSU阈值
3)其他各种阈值操作

1)二值化理解:超过阈值为1,低于为0也就是黑色白色。
二值化例子:

import  cv2 as cv
import  numpy as np
src=cv.imread('D:/731.png')
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)
ret,binary=cv.threshold(gray,177,255,cv.THRESH_BINARY)#设定一直为177超过177为1低于为0
cv.imshow('binary', binary)
cv.imshow('src',gray)
cv.waitKey(0)

在这里插入图片描述
2)OTSU阈值
和上面代码类似,不需要给阈值,计算机自动求取阈值

import  cv2 as cv
src=cv.imread('D:/731.png')
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)
# ret,binary=cv.threshold(gray,177,255,cv.THRESH_BINARY)
ret,binary=cv.threshold(gray ,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)#otsu自动求取阈值只需要给最小值和最大值
cv.imshow('binary', binary)
cv.imshow('src',gray)
cv.waitKey(0)

result:
在这里插入图片描述
3) 其他各种阈值操作

import  cv2 as cv
import  numpy as np
from matplotlib import  pyplot as plt
src=cv.imread('D:/731.png')
img=np.uint8(np.arange(400*400*3).reshape(400,400,3)/(400*400*3)*255)#生成渐变背景,不会的童鞋可以复习下numpy
#1简单阈值
ret,thersh1=cv.threshold(img,127,255,cv.THRESH_BINARY)#简单阈值,前面已经操作过了
#2反二值化
ret,thersh2=cv.threshold(img,127,255,cv.THRESH_BINARY_INV)#阈值反二值化,也就是反过来,你懂的
#TRUNC操作
ret,thersh3=cv.threshold(img,127,255,cv.THRESH_TRUNC)#小于阈值颜色不变大于阈值为阈值的灰度值。看下面的图可以
#阈值取0 小于阈值像素点置0,大于阈值像素点保持原色
ret,thersh4=cv.threshold(img,127,255,cv.THRESH_TOZERO)
#阈值取0再取反(上面那个反过来)
ret,thersh5=cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
title=['orignal image','binary image','binary_Inv IMAGE','TRUNC','TOZERO','tozero_inv']
image=[img,thersh1,thersh2,thersh3,thersh4,thersh5]
for i in range(len(image)):
    plt.subplot(2,3,i+1)
    plt.imshow(image[i],"gray")
    plt.title(title[i])
    plt.xticks([]),plt.yticks([])#轴清空
plt.show()

结果:
在这里插入图片描述
前面的操作都是在全图进行的阈值,那么这些有一定的局限性,例如一张左下角很亮右上角很暗的图片,那么此时对全图进行阈值操作就会有问题,所以接下来介绍局部阈值
3.自适应阈值:也叫局部二值化
局部二值化一定要做高斯滤波,不然噪点会使阈值效果变差

import cv2
import numpy as np

"#自适应阈值:局部二值化"
from matplotlib import pyplot as plt
img = cv2.imread('../images/6.jpg', 0)
# cv2.imshow("",img)
img = cv2.GaussianBlur(img, (5, 5), 0)
# cv2.imshow("",img)
# ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_OTSU)
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 9, 3)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 9, 3)


titles = ['Original Image', 'Global Thresholding (v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in range(4):
    plt.subplot(2, 2, i + 1),
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.imshow(th3,"gray")
plt.show()
cv2.waitKey(0)

结果:
在这里插入图片描述
3.图像像素操作
异或

import  numpy as np
import  cv2 as cv
img1=cv.imread("d:/1.jpg")
img2=cv.imread('d:/7.jpg')
img_xor=cv.bitwise_xor(img1,img2)
cv.imshow('',img_xor)
cv.waitKey(0)

自己可以搞两张图片看看,就是与或非操作,懂得都懂~
4.掩膜操作

import  numpy as np
import  cv2 as cv
img1=cv.imread("d:/1.jpg")
img2=cv.imread('d:/7.jpg')
img2gray=cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret,mask=cv.threshold(img2gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
mask_inv=cv.bitwise_not(mask)
# # 利用掩膜(mask)进行“与”操作,即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除。
img_bg=cv.bitwise_and(img1,img1,mask=mask_inv)#掩膜操作,img1与img1一起做与运算,但是有掩膜操作,黑字遮住了下部分
cv.imshow('',img_bg)
dst=cv.add(img_bg,img2)
cv.imshow('',dst)
cv.waitKey(0)

代码中的2张图:在这里插入图片描述
最后掩膜后的结果:
在这里插入图片描述
5.图像融合

import  numpy as np
import  cv2 as cv
img1=cv.imread("d:/1.jpg")
img2=cv.imread('d:/8.jpg')
img2=cv.resize(img2,(img1.shape[1],img1.shape[0]),interpolation=cv.INTER_LINEAR)
img3=cv.add(np.uint8(img1*0.5),np.uint8(img2*0.5))
cv.imshow('',img3)
cv.waitKey(0)

结果:在这里插入图片描述
累了累了老铁们,今天就写到这儿吧

版权声明:本文为owen_rui原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/owen_rui/article/details/109503623

智能推荐

前端小练习:jQuery酷炫照片墙

jQuery酷炫照片墙 效果展示: HTML代码: css代码: jQuery代码: 方法 解释 transform transform 属性向元素应用 2D 或 3D 转换。该属性允许我们对元素进行旋转、缩放、移动或倾斜。W3scool Math.random() 产生随机数。编程狮 translate 绘图函数编程狮 attr attr() 方法设置或返回被选元素的属性和值。编程狮 anima...

springMVC拦截器

一、     SpringMVC拦截器实现原理 用户请求到DispatherServlet中,DispatherServlet调用HandlerMapping查找Handler,HandlerMapping返回一个拦截器链(HandlerExecutionChain),springmvc中的拦截器是通过HandlerMapping发起的。 &nbs...

Unity Json反序列化

Json反序列化 结果:...

[机器学习-回归算法]Sklearn之线性回归实战

Sklearn之线性回归实战 一,前言 二,热身例子 三,贸易公司的简单例子 四,Sklearn 官网里的一个例子 参考资料 一,前言 一元线性回归的理论片请看我这个链接 二,热身例子 预测直线 y=1x1+2x2+3y = 1x_1 + 2x_2 +3y=1x1​+2x2​+3 导入LinearRegression 从Sklearn.liear_model 包里 拟合数据也可以说是训练 检验正确...

Android 开发者,你真的懂 Context 吗?

Android Context 详解 前言 一、Context是什么 二、Context结构 1、ContextImpl类介绍 2、ContextWrapper类介绍 3、ContextThemeWrapper 三、Context的数量 四、Context注意事项 五、如何正确回复以上面试题? 前言 Context 相信所有的 Android 开发人员基本上每天都在接触,因为它太常见了。但是这并不...

猜你喜欢

SpringMVC ----Json的简单交互处理

SpringMVC--Json Json的介绍 什么是JSON? JSON 和 JavaScript 对象互转 Controller返回JSON数据 Jackson 乱码 乱码的解决方法一 代码优化 乱码统一解决方法 返回json字符串统一解决 测试多个对象的集合输出 输出时间对象 抽取为工具类 FastJson fastjson 三个主要的类: JSONObject JSONArray JSON...

微信小程序自定义组件简单实现

本文将教你如何实现一个自定义的toast提示框,实现后的基本效果图如下: 小程序中一个自定义组件由 json wxml wxss js 4个文件组成的。下面我们一步一步地来创建文件及完成其中的配置: step1:创建自定义组件 首先创建一个components文件夹,用于放置所有自定义的组件,创建之后的目录结构为 其中的toastedit是我们本次...

PyTorch学习(四)--用PyTorch实现线性回归

教程视频:https://www.bilibili.com/video/BV1tE411s7QT 废话不多说,代码如下: 结果: 0 56.52023696899414 1 25.170454025268555 2 11.214292526245117 3 5.001270771026611 4 2.2352840900421143 5 1.0038176774978638 6 0.4554775...

1、Qt 的窗口组件和窗口类型

1、窗口组件 图形用户界面由不同的窗口和窗口组件组成 组件的类型 — 容器类(父组件):用于包含其它的界面组件 — 功能类(子组件):用于实现特定的交互功能 Qt 中没有父组件的顶级组件叫做窗口 QWidget QWidget 继承于 QObject 和 QPaintDevice — QObject 是所有支持 Qt 对象模型的基类 — QPaint...

从APP跳转到微信指定联系人聊天页面功能的实现与采坑之旅

从APP跳转到微信指定联系人聊天页面功能的实现与采坑之旅 起因 实现逻辑 效果图 实现过程 跳转微信按钮点击事件 无障碍监听主要方法 一些必要的参数 监听主要方法 遇到的坑 1. 搜索内容无法赋值给搜索框 2. 如何停止监听? 3. 没查询到结果如何停止监听? 4. 如果在微信其他页面怎么办? 5. 页面改变UI加载太慢 6. 聊天界面和主页面是同一个活动 7. 搜索不到结果时,发现他在搜索结果页...