OpenCV中的灰度化/二值化/canny

中央电视台,中央电视台,欢迎大家来到今日份opencv效果展示,下面介绍一下参赛选手,我家著名选狗,咩咩狗,今天大家看看咩咩的几幅不同的面孔。

                                                         来给大家叫两声,汪,汪

 1.灰度化

 直接上代码,默认大家都会读图

import cv2

path = r'./miemie4.jpg'
ori_image = cv2.imread(path)
cv2.imshow('ori_image',ori_image)

#灰度化
gray_image = cv2.cvtColor(ori_image, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray_image',gray_image)
cv2.waitKey()

感觉不大对劲,当世界变灰,总会给人一种它不在了的迹象,其实它活蹦乱跳的一批啊,其实还有一种方式

import cv2

path = r'./miemie4.jpg'
ori_image = cv2.imread(path,0)
cv2.imshow('ori_image',ori_image)
cv2.waitKey()

 看出来哪里不一样了吗,imread后面多了一个0,表示读图的模式0表示以灰度图读进来,-1表示以原图读进来,1也有一个模式,但是不建议使用。show出来和刚刚没什么两样

 2.二值化

二值化啥意思,顾名思义,就是二值化,二值化的效果主要看什么,主要看你设定的阈值高低,我这里演示的都是127的阈值,意思就是大于127,变成255,小于127变成0(或者反过来),这个还取决于你的二值化方式,直接上代码看看,我都说的是什么,一下就明白了

import cv2

path = r'./miemie4.jpg'
ori_image = cv2.imread(path)
# cv2.imshow('ori_image',ori_image)

#灰度化
gray_image = cv2.cvtColor(ori_image, cv2.COLOR_BGR2GRAY)
# cv2.imshow('gray_image',gray_image)
#二值化
ret, th1 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
ret, th2 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY_INV)
ret, th3 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_TRUNC)
ret, th4 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_TOZERO)
ret, th5 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow('th1',cv2.resize(th1,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.imshow('th2',cv2.resize(th2,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.imshow('th3',cv2.resize(th3,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.imshow('th4',cv2.resize(th4,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.imshow('th5',cv2.resize(th5,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.waitKey()

做个简单说明,刚刚说的那个阈值就是下面左边箭头那个位置,二值化的方式就是右边那个箭头的那个位置,一共有5种,其实还有几种,常见的就是这几种,值得一提的是还有自适应阈值的二值化方式,这里先不介绍。

 效果图展示一下,传说中的人模狗样吧,这么说也不合适,关键没有人样啊

再来个阈值50,看看效果

算了算了不试了,看不下去了。

稍微提醒一下,一般二值化的动作会接在灰度化之后,可以说这是一套相当强力的组合拳。各位看UFC和MMA吗?建议看看嘴炮麦康纳和毒液佩奇的比赛,真的挺有意思。

3.Canny

提供canny的写法,上代码

import cv2

path = r'./miemie4.jpg'
ori_image = cv2.imread(path)
cv2.imshow('ori_image',ori_image)

canny = cv2.Canny(ori_image,50,100)
cv2.imshow('Canny_edge_0',canny)

blurred = cv2.GaussianBlur(ori_image, (3,3), 0)
gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
# 求X方向上的梯度
grad_x = cv2.Sobel(gray, cv2.CV_16SC1, 1, 0)
# 求y方向上的梯度
grad_y = cv2.Sobel(gray, cv2.CV_16SC1, 0, 1)
# 将梯度值转化到8位上来
x_grad = cv2.convertScaleAbs(grad_x)
y_grad = cv2.convertScaleAbs(grad_y)
# 将两个梯度组合起来
src1 = cv2.addWeighted(x_grad, 0.5, y_grad, 0.5, 0)
# 组合梯度用canny算法,其中50和100为阈值
edge = cv2.Canny(src1, 50, 100)
cv2.imshow("Canny_edge_1", edge)
edge1 = cv2.Canny(grad_x, grad_y, 10, 100)
cv2.imshow("Canny_edge_2", edge1)
cv2.waitKey()

可以比较一下,三个canny出来的图的差距还是挺大的,大家可以自行对比一下代码,看看都是咋回事,还有你觉得那个图表现得额最好。

由于今天工作强大比较大,先更新到这里。比赛还没有结束,咩咩狗作为种子选手,在下半场又会给我们带来怎么样的表现呢?暂定一下,马上回来,下半场啥时候,看工作强大而定

值得一提的事,今天办公室让抽签看看这周谁是清洁委员,老板让我写一个代码来抽签,我写的代码还能抽到我,我也是真实在啊,就是做个弊谁能知道呢,害,还是太正直了。希望下次抽签random这个库给我几分薄面。

 至此,敬礼,salute!!!

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕里个咚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值