一、图片读取和显示

import cv2 as cv

# 图片读取cv.imread(img_path)
car_img = cv.imread("car1.png")
# 图片显示cv.imshow(window_name,img_mat)
cv.imshow('car1', car_img)
cv.waitKey(0)
# 图片写入cv.imwrite(save_path,img_mat)
cv.imwrite('car1_bk.jpg',car_img)

二、色彩空间转换

__author__ = 'Leo.Z'

import cv2 as cv

# 使用cvtColor()做色彩空间转换
def color_space_trans(img):
gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
hsv = cv.cvtColor(img, cv.COLOR_RGB2HSV)
yuv = cv.cvtColor(img, cv.COLOR_RGB2YUV)
ycrcb = cv.cvtColor(img, cv.COLOR_RGB2YCrCb)
cv.imshow('gray', gray)
cv.imshow('hsv', hsv)
cv.imshow('yuv', yuv)
cv.imshow('ycrcb', ycrcb)

同样的,我们也可以使用cv.cvtColor(img,cv.COLOR_YUV2RGB),将其转回RGB色彩空间。

三、利用HSV色彩空间提取某个颜色

如上图,我们使用3个范围的值,可以过滤出图像中的绿色部分。如下例子:

# 使用inRange()来获取HSV中某个范围的颜色
def filter_green():
img = cv.imread('plate2.png')
hsv = cv.cvtColor(img, cv.COLOR_RGB2HSV)
lower = np.array([35, 43, 46])
upper = np.array([77, 255, 255])
# 这里得到的masked是一个二值mask,即符合上述范围的位置为1,不符合为0
masked = cv.inRange(hsv, lowerb=lower, upperb=upper)
cv.imshow('src', img)
cv.imshow('masked', masked)
cv.waitKey(0)

四、分离和合并通道

def split_merge_channel():
img = cv.imread('girl1.png')
b, g, r = cv.split(img)
cv.imshow('blue', b)
cv.imshow('green', g)
cv.imshow('red', r) # 修改绿色通道的值
r[:] = 100
# 再将三个通道合并起来
merged = cv.merge([b, g, r])
cv.imshow('merged', merged)
cv.waitKey(0)

注意:默认用cv.imread(img_path)读进来的彩色图像是RGB的,但是从矩阵中来看,B是处于img[:,:,0]位置的,G在img[:,:,1],R在img[:,:,2]。如果使用cv.cvtColor(img,cv.COLOR_RGB2BGR)转换,则是将R和B的位置换了一下,但RGB的顺序还是2->1->0。

所以,一般使用默认读入的图像数据就好了。

五、图片的加减乘除

def add_img(img1, img2):
img_add = cv.add(img1, img2)
cv.imshow('add', img_add) def sub_img(img1, img2):
img_sub = cv.subtract(img1, img2)
cv.imshow('sub', img_sub) def mul_img(img1, img2):
img_sub = cv.multiply(img1, img2)
cv.imshow('multi', img_sub) def div_img(img1, img2):
img_sub = cv.divide(img1, img2)
cv.imshow('div', img_sub) image1 = cv.imread('WindowsLogo.jpg')
image2 = cv.imread('LinuxLogo.jpg') cv.imshow('windows', image1)
cv.imshow('linux', image2)
add_img(image1, image2)
sub_img(image1, image2)
mul_img(image1, image2)
div_img(image1, image2) cv.waitKey(0)

最左边两张图是原图,add是两图相加,当windows加上linux图片时,部分像素值超过255,被截取为255,所以显示为白色的linux字样。减法刚好相反,减去linux后,得到linux字样的负数,截取为0,所以显示为黑色。乘法中,linux字样的值为255,乘以对应windows中的像素,远超255,截取为255,显示白色。周边有一些彩色的点,是因为Linux的原图在那个位置可能有一定的噪声,稍微大于0,所以乘以windows中对应像素,显示彩色斑点。除法同样是这样。

六、计算图像均值和方差

# 计算均值和方差
def img_mean(img1, img2):
m1 = cv.mean(img1)
m2 = cv.mean(img2)
print(m1) # 输出(128.05269531250002, 109.60858072916668, 62.55748697916667, 0.0)
print(m2) # 输出(15.0128125, 15.0128125, 15.0128125, 0.0) # 同时计算均值和方差
def img_dev(img1, img2):
m1, d1 = cv.meanStdDev(img1)
m2, d2 = cv.meanStdDev(img2)
print(m1, d1)
#m1:[[128.05269531],[109.60858073],[ 62.55748698]]
#d1:[[54.60093646],[45.52335089],[50.01800277]]
print(m2, d2)
#m2:[[15.0128125],[15.0128125],[15.0128125]]
#d2:[[58.14062149],[58.14062149],[58.14062149]]

七、图片的逻辑计算

def logic_demo(img1, img2):
# 逻辑与
img_and = cv.bitwise_and(img1, img2)
# 逻辑或
img_or = cv.bitwise_or(img1, img2)
# 逻辑非(像素取补)
img_not = cv.bitwise_not(img1)
cv.imshow('and', img_and)
cv.imshow('or', img_or)
cv.imshow('not', img_not)

使用bitwise_add,用mask来过滤图像:

# 使用inRange()来获取HSV中某个范围的颜色
def filter_green():
img = cv.imread('plate2.png')
hsv = cv.cvtColor(img, cv.COLOR_RGB2HSV)
lower = np.array([35, 43, 46])
upper = np.array([77, 255, 255])
# 这里得到的masked是一个二值mask,即符合上述范围的位置为1,不符合为0
masked = cv.inRange(hsv, lowerb=lower, upperb=upper)
cv.imshow('src', img)
cv.imshow('masked', masked)
dst = cv.bitwise_and(img, img, mask=masked)
cv.imshow('dst', dst)
cv.waitKey(0)

八、addWeighted函数(图片加权求和)

def contract_brightness_demo(image, weight, bright):
h, w, c = image.shape
black = np.zeros([h, w, c], dtype=image.dtype)
dst = cv.addWeighted(image, weight, black, 1 - weight, bright)
cv.imshow('dst', dst)
contract_brightness_demo(img1,1.5,50)

上述代码中调用addWeight函数,weight=1.5,即原图权重为1.5,由于第二张图片为全0(黑色),所以不管权重是多少都不产生效果。

addWeight(img1,weight1,img2,weight2,gamma,dst)函数的参数说明:

img1:第一张图片

weight1:第一张图片占的权重

img2:第二章图片

weight2:第二章图片占的权重

gamma:在最终结果上加减多少值

dst:图片输出,也可以用返回接受,即dst = addWeight(...)

九、ROI与泛洪填充

ROI:region of interest,感兴趣区域。

按像素差值范围泛洪填充:

# 从图片某个点开始泛洪填充,注意mask的h和w都需要比原图大2个像素
def fill_color_demo(image):
cv.imshow('src', image)
copy_img = image.copy()
h, w = image.shape[:2]
mask = np.zeros([h + 2, w + 2], np.uint8)
cv.floodFill(copy_img, # 被填充图片
mask, # mask的值都为0,表示都需要填充
(30, 30), # 以(30,30)点作为起始点
(0, 255, 255), # 填充为黄色
(100, 100, 100), # 最低起始值为(30,30)的BGR值减去(100,100,100)
(50, 50, 50), # 最高值为(30,30)的BGR加上(50,50,50)
cv.FLOODFILL_FIXED_RANGE) # 按像素Diff范围填充
cv.imshow("fill color demo", copy_img)

按mask来泛洪填充:

def fill_binary():
# 创建一个图片,中心的一个200x200的正方形为白色255,其余部分为黑色0
image = np.zeros([400, 400, 3], np.uint8)
image[100:300, 100:300, :] = 255
cv.imshow("fill binary", image)
# 创建一个mask,比被填充图片hw都大2像素,单通道
mask = np.ones([402, 402, 1], np.uint8)
# 中间200x200部分为0,表示需要填充,其余部分为1,表示不需要填充
mask[101:301, 101:301] = 0
# (200,200)为种子点即起始点,(100,2,255)为填充颜色
cv.floodFill(image, mask, (200, 200), (100, 2, 255), cv.FLOODFILL_MASK_ONLY)
cv.imshow('filled binary', image)

十、平滑(模糊)操作

均值平滑:

# 均值模糊
def mean_blur(image):
img_blur = cv.blur(image, (5, 5))
cv.imshow('mean blur', img_blur)

方框平滑:

def box_blur(image):
img_blur = cv.boxFilter(image, -1, (5, 5), normalize=True)
cv.imshow('box blur', img_blur) img_blur2 = cv.boxFilter(image, -1, (5, 5), normalize=False)
cv.imshow('box blur 2', img_blur2)

在方框平滑中,当normalize = True时,和均值平滑是一样的,即kernel覆盖区域的像素值加起来做平均。而当normalize=False时,只将像素值加起来,而不做平均,所以超过255部分全部截断为255,呈现白色。

中值平滑

# 中值模糊,用于去除校验噪声很有用
def median_blur(image):
# 中值模糊要求的ksize为一个整数
img_blur = cv.medianBlur(image, 5)
cv.imshow('median blur', img_blur)

 自定义模糊:

# 自定义滤波
def custom_blur(image):
# 定义一个filter,均值滤波器
filter1 = np.ones((5, 5), np.float32) / 25
img = cv.filter2D(image, -1, kernel=filter1)
cv.imshow('img', img)

效果与均值模糊一样。

自定义filter:

def custom_filter(image):
# 定义一个拉普拉斯算子
filter2 = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]])
img2 = cv.filter2D(image, -1, kernel=filter2)
cv.imshow('img2', img2)

我们可以利用拉普卡斯算子做图像锐化:

def sharpen_image(image):
# 另一种拉普拉斯算子
filter = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]])
img = cv.filter2D(image, -1, kernel=filter)
cv.imshow('img', img) # filter的中心为5,相当于上面的拉普拉斯算子加上了原图像
filter2 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
shapen_img = cv.filter2D(image, -1, kernel=filter2)
cv.imshow('shapen_img', shapen_img)

OpenCV笔记(1)(图片读取与现实、色彩空间、基础运算、均值方差、逻辑运算、泛洪填充、均值中值及自定义平滑)的更多相关文章

  1. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...

  2. Opencv笔记(八)——图像上的算数运算

    学习目标: 学习图像上的算术运算,加法,减法,位运算等. 学习函数cv2.add(),cv2.addWeighted() 等. 一.图像的加法 你可以使用函数 cv2.add() 将两幅图像进行加法运 ...

  3. CV_图像滤波[转]---python+opencv均值滤波,高斯滤波,中值滤波,双边滤波

    1.图像滤波算法(cv2) https://blog.csdn.net/qq_27261889/article/details/80822270 2.

  4. 【学习笔记】tensorflow图片读取

    目录 图像基本概念 图像基本操作 图像基本操作API 图像读取API 狗图片读取 CIFAR-10二进制数据读取 TFRecords TFRecords存储 TFRecords读取方法 图像基本概念 ...

  5. opencv笔记3:trackbar简单使用

    time:2015年 10月 03日 星期六 13:54:17 CST # opencv笔记3:trackbar简单使用 当需要测试某变量的一系列取值取值会产生什么结果时,适合用trackbar.看起 ...

  6. opencv笔记2:图像ROI

    time:2015年 10月 03日 星期六 12:03:45 CST # opencv笔记2:图像ROI ROI ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区 ...

  7. opencv笔记1:opencv的基本模块,以及环境搭建

    opencv笔记1:opencv的基本模块,以及环境搭建 安装系统 使用fedora22-workstation-x86_64 安装opencv sudo dnf install opencv-dev ...

  8. opencv笔记4:模板运算和常见滤波操作

    time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...

  9. 怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?

      分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.b ...

随机推荐

  1. Python3数据插MySQL中文乱码解决方案

    1. database要utf8的 CREATE DATABASE spiderTest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 2. ...

  2. [转帖]linux 下yum使用技巧

    linux 下yum使用技巧 https://www.cnblogs.com/galengao/p/5750389.html 本文来自我的github pages博客http://galengao.g ...

  3. Ubuntu19.04系统SSH连接CentOS7虚拟机

    一.为CentOS7配置静态IP 注意查看宿主机(Ubuntu19.04)所在局域网段,当前为172.18.25.108 修改当前系统下virtual box的网络设置 [控制]-->[设置]- ...

  4. 2019中山纪念中学夏令营-Day21[JZOJ]

    2019中山纪念中学夏令营-Day21[JZOJ] 提高组(B组模拟赛)Team_B (由于本人太弱,并没有订正完题目) (题解大部分是从官方题解文件上摘来的) 日常膜拜大神:じやゆん蒟蒻 正文部分: ...

  5. vue : 无法加载文件 C:\Users\lihongjie\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 htt ps:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 + vue init webpack vue_p

    以管理员方式打开powershell 运行命令:set-ExecutionPolicy RemoteSigned 出现: 执行策略更改执行策略可帮助你防止执行不信任的脚本.更改执行策略可能会产生安全风 ...

  6. PB中的DataStore的应用示例

    编程过程中想在窗口中加一个下拉列表(DDLB),原来听同学说过可以动态改变下拉列表的值,数据库中的表改变,前台客户端的下拉列表就会变,记得当时同学说的是用一个叫下拉数据窗口(DDDW)的东西做的,一直 ...

  7. Hadoop单节点启动分布式伪集群

    emm~ 写这篇博客只是手痒,因为开发环境用单节点就够了,生产环境肯定是真实集群,所以这个伪分布式纯属娱乐而已. 配置HDFS1. 安装好一台hadoop,可以参考这篇博客.2. 在hadoop目录下 ...

  8. luogu P5504 [JSOI2011]柠檬

    bgm(雾) luogu 首先是那个区间的价值比较奇怪,如果推导后可以发现只有左右端点元素都是同一种\(s_x\)的区间才有可能贡献答案,并且价值为\(s_x(cnt(x)_r-cnt(x)_{l-1 ...

  9. jQuery操作选中select下拉框的值

    js和jQuery联合操作dom真的很好用,如果不是专业前端人员的话,我觉得吧前端语言只要熟练掌握js和jQuery就可以了. 获取select下拉框的几种情况如下: 1.获取第一个option的值 ...

  10. AngularJS 在实际应用中优缺点

    AngularJS 在实际应用中优点:模板功能强大丰富,并且是声明式的,自带了丰富的Angular指令:是一个比较完善的前端MV*框架,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所 ...