OpenCV

 为什么要OpenCV,当然都可以在Photoshop中解决,但是我们要自动化

1.


import cv2

print(cv2.getVersionString())
# 读取图片文件
image = cv2.imread("opencv_logo.jpg")
# 打印维度
print(image.shape)

# 调出照片
cv2.imshow("image", image)
# 不闪退
cv2.waitKey()

2.



import cv2

image = cv2.imread("opencv_logo.jpg")

cv2.imshow("blue", image[:, :, 0])
cv2.imshow("green", image[:, :, 1])
cv2.imshow("red", image[:, :, 2])

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)

cv2.waitKey()

3.裁剪


import cv2

image = cv2.imread("opencv_logo.jpg")

# 裁剪为向下10到170,到右40到200的正方形
crop = image[10:170, 40:200]

cv2.imshow("crop", crop)
cv2.waitKey()

4绘制:


import cv2
import numpy as np

image = np.zeros([300, 300, 3], dtype=np.uint8)

cv2.line(image, (100, 200), (250, 250), (255, 0, 0), 2)
cv2.rectangle(image, (30, 100), (60, 150), (0, 255, 0), 2)
cv2.circle(image, (150, 100), 20, (0, 0, 255), 3)
cv2.putText(image, "hello", (100, 50), 0, 1, (255, 255, 255), 2, 1)

cv2.imshow("image", image)
cv2.waitKey()

每一个OpenCV都是numpy数组数据结构,可以用numpy创建一个画布

zeros 函数创建了一个形状为 [300, 300, 3] 的三维数组,其元素全部初始化为0。这个数组将被用作图像数组。

  • [300, 300, 3] 表示数组的形状,其中 300 是图像的高度和宽度,而 3 表示图像的通道数。
  • dtype=np.uint8 指定了数组的数据类型为无符号8位整数,这是常用的图像数据类型。
  • 因此,np.zeros([300, 300, 3], dtype=np.uint8) 创建了一个300x300像素的彩色图像数组。
  • 这个数组的所有元素都初始化为0,表示一个全黑的图像。你可以通过对 image 数组进行操作来编辑和显示图像。

5.除噪点

 


import cv2

image = cv2.imread("plane.jpg")
# 高斯滤波器,seigemaX设为0(由内核大小来决定)
gauss = cv2.GaussianBlur(image, (5, 5), 0)
# 中值滤波器,内核为5的像素
median = cv2.medianBlur(image, 5)

cv2.imshow("image", image)
cv2.imshow("gauss", gauss)
cv2.imshow("median", median)

cv2.waitKey()

 test06_corner图像特征的提取,转角:

 使用 cv2.circle 函数在原始图像 image 上绘制一个半径为 3 的圆,圆心坐标为 (int(x), int(y))


import cv2

image = cv2.imread("opencv_logo.jpg")
                                # 彩色转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
                                # 获取特征点返回500个点,质量大于0.1,特征点距离大于10个像素
                                # 找到把每个店标记出来,其中参数 500 表示期望检测到的特征点数量,0.1 表示特征点质量阈值,10 表示特征点之间的最小距离。
corners = cv2.goodFeaturesToTrack(gray, 500, 0.1, 10)
for corner in corners:
    x, y = corner.ravel()
    cv2.circle(image, (int(x), int(y)), 3, (255, 0, 255), -1)

cv2.imshow("corners", image)
cv2.waitKey()

 test07_match匹配扑克牌上的菱形


import cv2
import numpy as np

image = cv2.imread("poker.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 选取图像的一个区域作为匹配模版,刚好包含一个菱形
template = gray[75:105, 235:265]
# 传入待检测图像和模版,使用标准相关匹配,算法(都标准化,是指不受光照强度的影响)
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
# 找出匹配系数大于0.9的匹配点
locations = np.where(match >= 0.9)
# 把模版的长宽求出来
w, h = template.shape[0:2]
# 遍历每一个匹配点 原始图像上画出对应的矩形框
for p in zip(*locations[::-1]):
    # 原始图像上画出对应的矩形框
    x1, y1 = p[0], p[1]
    x2, y2 = x1 + w, y1 + h
    cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)

cv2.imshow("image", image)
cv2.waitKey()


test08_gradient梯度算法


import cv2

# cv2.IMREAD_GRAYSCALE为使用方法
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
# 明暗变化趋势,梯度算法检测边缘
# 拉布拉斯算子,对应图像二级导数
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
# 卡尼边缘检测梯度区间定义边缘,完美检测……
canny = cv2.Canny(gray, 100, 200)

cv2.imshow("gray", gray)
cv2.imshow("laplacian", laplacian)
cv2.imshow("canny", canny)

cv2.waitKey()

 test09_threshold阈值(二进制)算法

阈:门槛的意思

OpenCV提供一个自适应阈值,即分成很多区域,各个分别计算阈值

binary_adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)

日本大金发明的 自动计算恰当阈值 ,使得灰度分布,剧烈分析算法        

 

 ret1, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

 


import cv2

gray = cv2.imread("bookpage.jpg", cv2.IMREAD_GRAYSCALE)
#最简单为固定阈值  阈值为10,最大灰度为255
ret, binary = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)
binary_adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)
ret1, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

cv2.imshow("gray", gray)
cv2.imshow("binary", binary)
cv2.imshow("adaptive", binary_adaptive)
cv2.imshow("otsu", binary_otsu)

cv2.waitKey()

 test10_morphology形态学算法

腐蚀,膨胀(减少和增加边缘)

基于二值化图像

cv2.THRESH_BINARY_INV反向阈值。因为原始 背景图是白色的

kernel 5x5像素的正方形

用kernel腐蚀binary图像


import cv2
import numpy as np

gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)

_, binary = cv2.threshold(gray, 200, 255,  )
kernel = np.ones((5, 5), np.uint8)

erosion = cv2.erode(binary, kernel)
dilation = cv2.dilate(binary, kernel)

cv2.imshow("binary", binary)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)


cv2.waitKey()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白天的我最菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值