【Python】OpenCV库学习笔记(四)

1. ROI

  • ROI(region of interest),也就是感兴趣区域,如果你设置了图像了ROI,那么在使用OpenCV的函数的时候,会只对ROI区域操作,其他区域忽略。
import cv2 as cv
import numpy

image = cv.resize(cv.imread("star.jpg"), (400, 300))
cv.imshow("image", image)
# 选取出目标区域
region = image[50:200, 100:250]
# 将目标区域变成灰色
gray = cv.cvtColor(region, cv.COLOR_BGR2GRAY)
# 再将目标区域放回原图
image[50:200, 100:250] = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)
cv.imshow("image", image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

2. 泛洪填充

def floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
  • image表示原图
  • mask表示遮罩图
  • seedPoint表示填充起始坐标
  • newVal表示需要填充的颜色
  • loDiff表示需要填充颜色的像素值的下限
  • upDiff表示需要填充颜色的像素值的上限
  • flags表示填充方法,彩色图像填充必须为FLOODFILL_FIXED_RANGE,二值图像使用

假设seedPoint的值为(R,G,B),遍历整张图片,将所有像素点的值位于(R-loDiff,G-loDiff,B-loDiff)~(R+upDiff,GR+upDiff,BR+upDiff)的点全部变成newVal颜色

(1)填充彩色图像

import cv2 as cv
import numpy


def flood_fill_demo(image):
    copy_image = image.copy()   # 拷贝图片
    h, w = image.shape[:2]    # 获取图片宽和高
    mask = numpy.zeros([h + 2, w + 2], numpy.uint8)  # 获取一张mask,其大小必须比原图长和宽大2
    cv.floodFill(copy_image, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("flood_fill_image", copy_image)

image = cv.resize(cv.imread("star.jpg"), (400, 300))
cv.imshow("image", image)
flood_fill_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

(2)填充二值图像

import cv2 as cv
import numpy

def fill_binary_demo():
    # 创建一张中间白周围黑的图片
    image = numpy.zeros([400, 400, 3], numpy.uint8)
    image[100:300, 100:300, :] = 255
    cv.imshow("image", image)

    # 创建遮罩图
    mask = numpy.ones([402, 402, 1], numpy.uint8)
    mask[101:301, 101:301] = 0
    # 从(200,200)点向周围填充(0, 0, 255)这个颜色
    cv.floodFill(image, mask, (200, 200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled image", image)

fill_binary_demo()
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

3. 模糊操作

模糊操作原理:

  • 基于离散卷积
  • 定义好每个卷积核
  • 不同卷积核得到不同的卷积效果
  • 模糊是卷积的一种表象

卷积计算原理:

在这里插入图片描述

3.1 均值模糊

  • 可以用于去除
import cv2 as cv
import numpy


def blur_demo(image):
    dst = cv.blur(image, (20, 1))
    cv.imshow("dst", dst)

image = cv.imread("01.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", image)
blur_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

3.2 中值模糊

  • 可以用于去除椒盐噪声

原图中有许许多多的小黑点,使用中值模糊可以将小黑点给去除,这就叫去除椒盐噪声

import cv2 as cv
import numpy

def mid_blur(image):
    dst = cv.medianBlur(image, 5)
    cv.imshow("dst", dst)

image = cv.imread("test1.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", image)
mid_blur(image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

3.2 自定义模糊

  • 主要自定义卷积核
import cv2 as cv
import numpy

def cus_blur(image):
    # 自定义初始化卷积核
    kernel = numpy.ones([17, 17], numpy.float32) / 200
    dst = cv.filter2D(image, -1, kernel=kernel)
    cv.imshow("dst", dst)

image = cv.imread("test1.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", image)
cus_blur(image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

  • 还可以用于锐化(增强立体感)
import cv2 as cv
import numpy

def cus_blur(image):
    kernel = numpy.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], numpy.float32)
    dst = cv.filter2D(image, -1, kernel=kernel)
    cv.imshow("dst", dst)

image = cv.imread("01.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", image)
cus_blur(image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

4. 高斯模糊

二维高斯分布

在这里插入图片描述

立体高斯分布

在这里插入图片描述

  • 代码层面
import cv2 as cv
import numpy


def clamp(pv):
    if pv > 255:
        return 255
    if pv < 0:
        return 0
    return pv

def gaussion_noise(image):
    h, w, c = image.shape
    for row in range(w):
        for col in range(h):
            s = numpy.random.normal(0, 20, 3)
            B = image[row, col, 0]
            G = image[row, col, 1]
            R = image[row, col, 2]
            image[row, col, 0] = clamp(B + s[0])
            image[row, col, 1] = clamp(G + s[1])
            image[row, col, 2] = clamp(R + s[2])
    cv.imshow("noise image", image)

image = cv.imread("01.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", image)
gaussion_noise(image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

5. 边缘保留滤波

5.1 高斯双边

def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
  • src表示图像
  • d表示distance,可以设置为0
  • sigmaColor取大一点,为了将小的噪声给模糊掉
  • sigmaSpace取小一点
import cv2 as cv
import numpy


def demo(image):
    dst = cv.bilateralFilter(image, 0, 100, 15)
    cv.imshow("dst",dst)

image = cv.imread("01.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", image)
demo(image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

5.2 均值迁移

def pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None)
import cv2 as cv
import numpy

def demo(image):
    dst = cv.pyrMeanShiftFiltering(image, 10, 50)
    cv.imshow("dst",dst)

image = cv.imread("star.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", image)
demo(image)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值