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()
def floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
假设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()
模糊操作原理:
- 基于离散卷积
- 定义好每个卷积核
- 不同卷积核得到不同的卷积效果
- 模糊是卷积的一种表象
卷积计算原理:
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()
椒盐噪声
原图中有许许多多的小黑点,使用中值模糊可以将小黑点给去除,这就叫
去除椒盐噪声
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()
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()
二维高斯分布
立体高斯分布
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()
def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
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()
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()