OpenCV 实战 Chaper2 图像处理

news/2024/7/21 7:06:32 标签: opencv, 图像处理, 计算机视觉

文章目录

  • 灰度图
  • HSV
  • 图像阈值
  • 图像平滑
  • 图像形态学
    • 腐蚀
    • 膨胀
    • 开运算与闭运算
    • 梯度与运算
    • 礼帽与黑帽

灰度图

img = cv2.imread('dog.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.resize(img_gray, (50, 50))
cv2_imshow(img_gray)

在这里插入图片描述

HSV

  • H - 色调(主波长)。
  • S - 饱和度(纯度/颜色的阴影)。
  • V值(强度)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2_imshow(img_hsv)

在这里插入图片描述

图像阈值

ret, dst = cv2.threshold(src, thresh, maxval, type)

  • src: 输入图,只能输入单通道图像,通常来说为灰度图

  • dst: 输出图

  • thresh: 阈值

  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0

  • cv2.THRESH_BINARY_INV THRESH_BINARY的反转

  • cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变

  • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['Original', 'Binary', 'Binary_INV', 'Trunc', 'To_Zero', 'To_Zero_INV']
imgs = [img_gray, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
  plt.subplot(2, 3, i + 1), plt.imshow(imgs[i], 'gray')
  plt.title(titles[i])
  plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

图像平滑

卷积就是均值滤波器,比如一个3*3的都是1的卷积,和图像本身做内积,最后得到的值是图像9个像素点的求和平均值。

img = cv2.imread('lenaNoise.png')
cv2_imshow(img)

在这里插入图片描述

# 均值滤波
blur = cv2.blur(img, (3, 3))
cv2_imshow(blur)

在这里插入图片描述

# 方框滤波
# 基本和均值滤波一样,可以选择归一化
box = cv2.boxFilter(img, -1, (3, 3), normalize=True)
cv2_imshow(box)

在这里插入图片描述

# 方框滤波
# 基本和均值滤波一样,选择不归一化
box = cv2.boxFilter(img, -1, (3, 3), normalize=False)
cv2_imshow(box)

在这里插入图片描述

# 高斯滤波
# 卷积核的数值是满足高斯分布的,相当于更重视中间
gaussian = cv2.GaussianBlur(img, (5, 5), 1)
cv2_imshow(gaussian)

在这里插入图片描述

# 中值滤波
# 相当于用中值替代
median = cv2.medianBlur(img, 3)
cv2_imshow(median)

在这里插入图片描述
中值滤波,效果最好

# 展示全部
res = np.hstack((box, gaussian, median))
cv2_imshow(res)

在这里插入图片描述

图像形态学

img = cv2.imread('dige.png')
cv2_imshow(img)

在这里插入图片描述

腐蚀

kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
cv2_imshow(erosion)

在这里插入图片描述

kernel = np.ones((3, 3), np.uint8)
erosion1 = cv2.erode(img, kernel, iterations=1)
erosion2 = cv2.erode(img, kernel, iterations=2)
erosion3 = cv2.erode(img, kernel, iterations=3)
res = np.hstack((erosion1, erosion2, erosion3))
cv2_imshow(res)

在这里插入图片描述
也可以用下面的代码:

erode = cv2.morphologyEx(img, cv2.MORPH_ERODE, kernel)
cv2_imshow(erode)

膨胀

kernel = np.ones((3, 3), np.uint8)
dige_dilate = cv2.dilate(img, kernel, iterations=1)
cv2_imshow(dige_dilate)

在这里插入图片描述

kernel = np.ones((3, 3), np.uint8)
dige_dilate1 = cv2.dilate(img, kernel, iterations=1)
dige_dilate2 = cv2.dilate(img, kernel, iterations=2)
dige_dilate3 = cv2.dilate(img, kernel, iterations=3)
res = np.hstack((dige_dilate1, dige_dilate2, dige_dilate3))
cv2_imshow(res)

在这里插入图片描述
也可以用下面代码:

dilate = cv2.morphologyEx(img, cv2.MORPH_DILATE, kernel)
cv2_imshow(dilate)

开运算与闭运算

# 开运算:先腐蚀 再膨胀
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2_imshow(opening)

在这里插入图片描述

# 闭运算:先膨胀 再腐蚀
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2_imshow(closing)

在这里插入图片描述

梯度与运算

# 梯度 = 膨胀 - 腐蚀
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2_imshow(gradient)
# 梯度 = 膨胀 - 腐蚀
cv2_imshow(dige_dilate - erode)

在这里插入图片描述

礼帽与黑帽

# 礼帽 = 原始输入 - 开运算结果
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2_imshow(tophat)

在这里插入图片描述

# 黑帽 = 闭运算 - 原始输入
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2_imshow(blackhat)

在这里插入图片描述


http://www.niftyadmin.cn/n/1207782.html

相关文章

百度地图 鼠标绘制,获取矩形,多边形的顶点经纬度

做个记录 http://developer.baidu.com/map/jsdemo.htm#h0_3 百度之给了线,圆的经纬度点获取,没给多边形 有个p.getPath().length 所以对于 多边形和矩形 是个点的轨迹数组 drawingManager.addEventListener(polygoncomplete, function(e,p){     deb…

Leetcode 专题训练 递归和分治(二)

文章目录深入理解递归 - 1归并排序快速排序深入理解递归 - 1 归并排序 912. 排序数组 给你一个整数数组 nums,请你将该数组升序排列。 这个归并排序写了2天才看着答案写出来的,真是不容易。就是因为之前没有认真的练习,当时只写了快速排序的…

Leetcode 专题训练 递归和分治(三)

文章目录深度理解递归-练习题912. 排序数组归并排序快速排序深度理解递归-练习题 912. 排序数组 归并排序 尝试的复习了昨天的归并排序&#xff0c;重新理解了为什么要用while i < mid 或者while j < right对剩下的数组进行合并。而不能直接拼接&#xff0c;那样会有问…

maven工程 看不到Maven dependencies

maven工程 看不到Maven dependencies解决方案&#xff1a;1&#xff1a;备份之前的pom文件&#xff1b;2&#xff1a;删除pom文件&#xff1b;3&#xff1a;项目右键--Maven--Enable Dependency Management;4&#xff1a;这样maven会给项目新建一个pom.xml&#xff1b;5&#…

Leetcode 专题训练 递归和分治(四)

文章目录剑指 Offer 51. 数组中的逆序对215. 数组中的第K个最大元素剑指 Offer 51. 数组中的逆序对 暴力解法&#xff0c;时间超时&#xff1a; def reversePairs(self, nums: List[int]) -> int:count 0for i in range(len(nums)-1):for j in range(i1, len(nums)):if nu…

【如何正确使用const,static,extern】|那些人追的干货

2019独角兽企业重金招聘Python工程师标准>>> 【如何正确使用const,static,extern】|那些人追的干货 一、const与宏的区别&#xff08;面试题&#xff09;: const简介:之前常用的字符串常量&#xff0c;一般是抽成宏&#xff0c;但是苹果不推荐我们抽成宏&#xff0c…

Leetcode 专题训练 递归和分治(五)

文章目录归并排序-K神版本剑指 Offer 51. 数组中的逆序对315. 计算右侧小于当前元素的个数归并排序-K神版本 K神归并排序代码更简单一些&#xff0c;但是上次我只是勉强看懂&#xff0c;今天尝试复现一下&#xff0c;因为后面的315和剑指offer51都要用到归并排序。 def sortA…

剑指offer 刷题 二十二 位运算(56-I 56-II)

剑指 Offer 56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外&#xff0c;其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)&#xff0c;空间复杂度是O(1)。 插播知识点&#xff1a;Python 中 &#xff08;&&#xff0c…