OpenCV高级图像处理学习笔记

简介: OpenCV高级图像处理学习笔记

4.1 混合两张图像

#Import required packages
import cv2
#Read image 1
img1=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
#Read image 2
img2=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat2.jpg")
#Define alpha and beta
alpha=0.30
beta=0.70
#Blend images
final_image=cv2.addWeighted(img1,alpha,img2,beta,0.0)
#show image
cv2.imshow('mix',final_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

将两张猫咪的图片混合了起来。

4.2 改变图像的对比度和亮度

#Import required packages
import cv2
import numpy as np
#Read images
image=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
#Create a dummy image that stores different contrast and brightness
new_image=np.zeros(image.shape,image.dtype)
#Brightness and contrast parameters
contrast=3.0
bright=2
#Change the contrast and brightness  
for y in range(image.shape[0]):
    for x in range(image.shape[1]):
        for c in range(image.shape[2]):
            new_image[y,x,c]=np.clip(contrast*image[y,x,c]+bright,0,255)
cv2.namedWindow('original', cv2.WINDOW_NORMAL)
cv2.imshow('original',image)
cv2.namedWindow('transform', cv2.WINDOW_NORMAL)
cv2.imshow('transform',new_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.3 往图像中添加文字

cv2模块中的cv2.putText()函数可以往图像中添加文字。

#import required packages
import cv2
#Read image
image=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
#Define font
font=cv2.FONT_HERSHEY_SIMPLEX
#Write on the image
cv2.putText(image,"I am a Cat",(230,50),font,0.8,(0,255,0),2,cv2.LINE_AA)
cv2.namedWindow('AddText', cv2.WINDOW_NORMAL)
cv2.imshow('AddText',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.4 平滑图像

三种用于平滑图像的滤波器

  • 中值滤波器
  • 高斯滤波器
  • 双边滤波器

4.4.1 中值滤波器

cv2.medianBlur()函数能够实现中值模糊的效果。

4.4.2 高斯滤波器

cv2.GaussianBlur()函数应用于高斯滤波器。

4.4.3 双边滤波器

cv2.bilateralFilter()函数

#Import required packages
import cv2
#Read images for different blurring purposes
image_Original=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
image_MedianBlur=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
image_GaussianBlur=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
image_BilateralBlur=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
#Blur images
image_MedianBlur=cv2.medianBlur(image_MedianBlur,9)
image_GaussianBlur=cv2.GaussianBlur(image_GaussianBlur,(9,9),10)
image_BilateralBlur=cv2.bilateralFilter(image_BilateralBlur,9,100,75)
#show images
cv2.namedWindow('image_MedianBlur', cv2.WINDOW_NORMAL)
cv2.imshow('image_MedianBlur',image_MedianBlur)
cv2.namedWindow('image_GaussianBlur', cv2.WINDOW_NORMAL)
cv2.imshow('image_GaussianBlur',image_GaussianBlur)
cv2.namedWindow('image_BilateralBlur', cv2.WINDOW_NORMAL)
cv2.imshow('image_BilateralBlur',image_BilateralBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.5 改变图像的形状

两种改变图像的操作:侵蚀(erosion)和扩张(dilation)。扩张操作导致物体边界的像素增加,侵蚀操作导致物体边界的像素减少。

cv2.getStructuringElement()函数用于定义核,作为侵蚀或扩张函数的参数。

# EROSION CODE:
#Import package
import cv2
#Read image
image=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
#Define erosion size
s1=0
s2=10
s3=10
#Define erosion type
t1=cv2.MORPH_RECT
t2=cv2.MORPH_CROSS
t3=cv2.MORPH_ELLIPSE
#Define and save the erosion template
tmp1=cv2.getStructuringElement(t1,(2*s1+1,2*s1+1),(s1,s1))
tmp2=cv2.getStructuringElement(t2,(2*s2+1,2*s2+1),(s2,s2))
tmp3=cv2.getStructuringElement(t3,(2*s3+1,2*s3+1),(s3,s3))
#Apply the erosion template to the image and save in different variables
final1=cv2.erode(image,tmp1)
final2=cv2.erode(image,tmp2)
final3=cv2.erode(image,tmp3)
#Show all the images with different erosions
cv2.namedWindow('final1', cv2.WINDOW_NORMAL)
cv2.imshow('final1',final1)
cv2.namedWindow('final2', cv2.WINDOW_NORMAL)
cv2.imshow('final2',final2)
cv2.namedWindow('final3', cv2.WINDOW_NORMAL)
cv2.imshow('final3',final3)
cv2.waitKey(0)
cv2.destroyAllWindows()

# DILATION CODE:
#Import package
import cv2
#Read image
image=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
#Define erosion size
d1=0
d2=10
d3=20
#Define erosion type
t1=cv2.MORPH_RECT
t2=cv2.MORPH_CROSS
t3=cv2.MORPH_ELLIPSE
#Define and save the erosion template
tmp1=cv2.getStructuringElement(t1,(2*d1+1,2*d1+1),(d1,d1))
tmp2=cv2.getStructuringElement(t2,(2*d2+1,2*d2+1),(d2,d2))
tmp3=cv2.getStructuringElement(t3,(2*d3+1,2*d3+1),(d3,d3))
#Apply the erosion template to the image and save in different variables
final1=cv2.dilate(image,tmp1)
final2=cv2.dilate(image,tmp2)
final3=cv2.dilate(image,tmp3)
#Show all the images with different erosions
cv2.namedWindow('final1', cv2.WINDOW_NORMAL)
cv2.imshow('final1',final1)
cv2.namedWindow('final2', cv2.WINDOW_NORMAL)
cv2.imshow('final2',final2)
cv2.namedWindow('final3', cv2.WINDOW_NORMAL)
cv2.imshow('final3',final3)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.6 实现图像阈值化

首先需要将图像转换成灰度格式,然后转换成二值格式——只有黑色与白色的图像。

提供一个参考值,然后将所有值大于或小于它的像素都转换成黑色或白色。

使用cv2.threshold()函数做图像阈限化。

#Import packages
import cv2
#Read image
image=cv2.imread("C:\\Users\\mac\\Pictures\\measure\\cat1.jpg")
#Define threshold types
'''
0 - Binary
1 - Binary Inverted
2 - Truncated
3 - Threshold To Zero
4 - Threshold To Zero Inverted
'''
#Apply different threshold and save in different variables
_, img1=cv2.threshold(image,50,255,0)
_, img2=cv2.threshold(image,50,255,1)
_, img3=cv2.threshold(image,50,255,2)
_, img4=cv2.threshold(image,50,255,3)
_, img5=cv2.threshold(image,50,255,4)
#Show the different threshold images
cv2.namedWindow('img1', cv2.WINDOW_NORMAL)
cv2.imshow('img1',img1)
cv2.namedWindow('img2', cv2.WINDOW_NORMAL)
cv2.imshow('img2',img2)
cv2.namedWindow('img3', cv2.WINDOW_NORMAL)
cv2.imshow('img3',img3)
cv2.namedWindow('img4', cv2.WINDOW_NORMAL)
cv2.imshow('img4',img4)
cv2.namedWindow('img5', cv2.WINDOW_NORMAL)
cv2.imshow('img5',img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.7 计算梯度

在本节中,将介绍如何使用索伯导数(Sobel derivative)做边缘检测。边有两种方向:垂直方向和水平方向。。针对这种算法,我们强调只有空间频率非常高的区域才能算作边。一个区域的空间频率是指这个区域内的细节丰富程度。

在下面的代码中,我们用高斯模糊去除噪声,然后将图像转换成灰度图。我们使用cv2.cvtColor()函数将图像转换成灰度图。skimage模块里的函数也能达到同样的效果。最后,我们将灰度图输出到cv2.Sobel()函数。

相关文章
|
2月前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
143 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
130 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
2月前
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
38 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
2月前
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
174 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
4月前
|
计算机视觉 索引
OpenCV4学习笔记(2):显示相机视频流的帧率
这篇文章是OpenCV4学习笔记的第二部分,介绍了如何通过OpenCV4在显示相机视频流时计算并显示其帧率,使用`getTickCount`和`getTickFrequency`函数来测量帧时间,并用`putText`在图像上绘制帧率信息。
OpenCV4学习笔记(2):显示相机视频流的帧率
|
2月前
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
103 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
2月前
|
算法 计算机视觉
Opencv学习笔记(六):cv2.resize函数的介绍
这篇文章介绍了OpenCV库中cv2.resize函数的使用方法,包括其参数、插值方式选择以及实际代码示例。
351 1
Opencv学习笔记(六):cv2.resize函数的介绍
|
2月前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
109 1
|
2月前
|
计算机视觉
Opencv学习笔记(五):cv2.putText()和cv2.rectangle()详细理解
这篇文章详细介绍了OpenCV库中的`cv2.putText()`和`cv2.rectangle()`函数的使用方法,并通过一个实战例子展示了如何使用这些函数在图像上绘制文字和矩形框。
178 0
Opencv学习笔记(五):cv2.putText()和cv2.rectangle()详细理解
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
477 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解