OpenCV庫學習筆記(四)
- 1. ROI
- 2. 泛洪填充
- 3. 模糊操作
- 3.1 均值模糊
- 3.2 中值模糊
- 3.2 自定義模糊
- 4. 高斯模糊
- 5. 邊緣保留濾波
- 5.1 高斯雙邊
- 5.2 均值遷移
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()

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250690.html
標籤:python
上一篇:【nuitka】 Fatal Python error: Py_Initialize: unable to load the file system codec
