图像基本操作(滤波,平滑,锐化,轮廓提取等)

2018-12-29  本文已影响16人  秋酿_8842

这里一共包含了7种锐化方法,3种滤波方法,一种平滑方法,以及三种具体的功能实现,常用的基本图像操作基本都全了。直接上码。

1 直方图均衡化 histogram_equalize(src)

输入图像为灰度图。
第一步,实现了对各个灰度级数量的计算。
第二步,实现了对灰度级累计分布的计算。
第三步,将累计概率函数放大到0~255的区间,对于放大过程中大于255的灰度值置255,小于0的置0.
第四步,进行灰度映射转换。

def histogram_equalize(src):
    img_gray = cv2.cvtColor(src, cv2.COLOR_RGB2GRAY)
    rows, cols = img_gray.shape
    gray_flat = img_gray.reshape((rows * cols,))
    dist_flat = np.zeros_like(gray_flat)
    count_pixel = np.zeros((256,), np.int32)
    temp = np.zeros((256,), np.int32)
    pixmap = np.zeros((256,), np.uint8)
    image_bytes = cols * rows
    # 计算各个灰度级数量
    for index, value in enumerate(gray_flat):
        count_pixel[value] += 1
    # 计算灰度级的累计分布
    for i in range(256):
        if i == 0:
            temp[0] = count_pixel[0]
        else:
            temp[i] = temp[i - 1] + count_pixel[i]
        # 计算累计概率函数,并把值扩展到0~255
        value = 255.0 * (temp[i] / image_bytes)
        if value > 255:
            value = 255
        if value < 0:
            value = 0
        pixmap[i] = value
    # 灰度等级映射转换
    for i in range(image_bytes):
        dist_flat[i] = pixmap[gray_flat[i]]
    dist = dist_flat.reshape((rows, cols))
    return dist

2 图像清晰化 mage_clarify(src[, T = 30])

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
第一步,获取原始图像的robot锐化结果。
第二部,对于像素值大于等于T的像素点置T,小于T的不做处理。

def image_clarify(src, T = 30):
    result = src.copy()
    robot_img = robot_sharpen(result)
    width, height = result.shape
    for i in range(width):
        for j in range(height):
            if robot_img[i][j] >= T:
                result[i][j] = T
    return result

3 图像二值化 two_value(src[, T=30])

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
对于图像中像素值大于等于T的置255,否则置0.

def two_value(src, T=30):
    result = src.copy()
    width, height = result.shape
    for i in range(width):
        for j in range(height):
            if result[i][j] >= T:
                result[i][j] = 255
            else:
                result[i][j] = 0
    return result

4 中值滤波 median_filter(src[, k_size=3])

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
此方法中调用了opencv中的种植滤波函数。

def median_filter(src, k_size=3):
    result = src.copy()
    return cv2.medianBlur(result, k_size)

5 高斯滤波 gaussian_filter(src[, k_size=3])

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
方法中对于输入的size转换为了可以被opencv中高斯滤波函数识别的高斯核,继而进行了高斯滤波操作。

def gaussian_filter(src, k_size=3):
    result = src.copy()
    kernel = cv2.getGaussianKernel(k_size, (0.3 * ((k_size - 1) * 0.5 - 1) + 0.8))
    return cv2.filter2D(result, -1, kernel)

6 均值滤波 blur_filter(src[, k_size=3])

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
方法中将输入的k_size转化为size元组,继而直接调用opencv中的均值滤波函数。

def blur_filter(src, k_size=3):
    result = src.copy()
    size = (k_size, k_size)
    return cv2.blur(result, size)

7 拉普拉斯锐化 laplace_sharpen(src)

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
直接调用opencv内部的laplace锐化函数,对转化后的结果取绝对值,继而返回锐化后的图像。

def laplace_sharpen(src):
    result = src.copy()
    return cv2.convertScaleAbs(cv2.Laplacian(result, -1))

8 sobel锐化 sobel_sharpen(src)

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
获取x方向和y方向上的sobel锐化结果,返回sobel_x和sobel_y的和,即为sobel锐化结果。
此操作可用于实现图像边缘提取。

def sobel_sharpen(src):
    result = src.copy()
    sobel_x = cv2.Sobel(result, -1, 1, 0)
    sobel_y = cv2.Sobel(result, -1, 0, 1)
    return cv2.add(sobel_x, sobel_y)

9 prewitt锐化 prewitt_sharpen(src)

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
第一步,定义x方向和y方向上的两个锐化模板。
第二步,使用两个模板分别对图像进行filter2D的滤波操作,返回dst_x和dst_y两个结果。
第三步,返回两个图像之和,即为prewitt锐化结果。

def prewitt_sharpen(src):
    result = src.copy()
    kernel_x = np.array([
        [1, 1, 1],
        [0, 0, 0],
        [-1, -1, -1]
    ])
    kernel_y = np.array([
        [-1, -1, -1],
        [0, 0, 0],
        [1, 1, 1]
    ])
    dst_x = cv2.filter2D(result, -1, kernel_x)
    dst_y = cv2.filter2D(result, -1, kernel_y)
    return cv2.add(dst_x, dst_y)

10 robot锐化 robot_sharpen(source)

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
第一步,定义两个锐化模板kernel_x和kernel_y。
第二步,分别使用两个锐化模板对原始图像进行滤波操作,得到dst_x和dst_y两个锐化后的图像。
第三步,返回dst_x与dst_y之和。

def robot_sharpen(source):
    temp_img = source.copy()
    kernel_x = np.array([
        [-1, 0],
        [0, 1]
    ])
    kernel_y = np.array([
        [0, -1],
        [1, 0]
    ])
    dst_x = cv2.filter2D(temp_img, -1, kernel_x)
    dst_y = cv2.filter2D(temp_img, -1, kernel_y)

    dst_img = cv2.add(dst_x, dst_y)
    return dst_img

11 频域平滑(等效于低通滤波) frequency_smooth(src[, radius=30)]

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
第一步,新建一个全0模板mask,将以模板中心为中,边长为2*radius的正方形置于1。
第二步,快速傅里叶变换,空域转频域。
第三步,使用mask模板对频域图像进行滤波。
第四步,频域转空域,反快速傅里叶变换。
第五步,对上一步的到的图像进行取绝对值操作。

def frequency_smooth(src, radius=30):
    result = src.copy()
    mask = np.zeros(result.shape, np.uint8)
    row, col = result.shape
    r = int(row / 2)
    c = int(col / 2)
    mask[r - radius:r + radius, c - radius:c + radius] = 1
    f = np.fft.fft2(result)
    f_shift = np.fft.fftshift(f)
    low_shift = f_shift * mask
    low_shift = np.fft.ifftshift(low_shift)
    low_img = np.fft.ifft2(low_shift)
    return np.abs(low_img)

12 频域锐化(等效于高通滤波) frequency_sharpen(src[, radius=30])

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
第一步,新建一个全1模板mask,将以模板中心为中,边长为2*radius的正方形置于0。
第二步,快速傅里叶变换,空域转频域。
第三步,使用mask模板对频域图像进行滤波。
第四步,频域转空域,反快速傅里叶变换。
第五步,对上一步的到的图像进行取绝对值操作。

def frequency_sharpen(src, radius=30):
    result = src.copy()
    mask = np.ones(result.shape, np.uint8)
    row, col = result.shape
    r = int(row / 2)
    c = int(col / 2)
    mask[r - radius:r + radius, c - radius:c + radius] = 0
    f = np.fft.fft2(result)
    f_shift = np.fft.fftshift(f)
    high_shift = f_shift * mask
    high_shift = np.fft.ifftshift(high_shift)
    high_img = np.fft.ifft2(high_shift)
    return np.abs(high_img)

13 butterworth锐化 butterworth_sharpen(src[, T=30])

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
第一步,获取原始图像的robot锐化结果。
第二步,将原始灰度图result中,robot锐化结果小于阈值T的点置T,大于阈值T的不予操作。

def butterworth_sharpen(src, T=30):
    result = src.copy()
    robot_img = robot_sharpen(result)
    width, height = result.shape
    for i in range(width):
        for j in range(height):
            if robot_img[i][j] < T:
                result[i][j] = T
    return result

14 butterworth_lg锐化 butterworth_lg_sharpen(src, T=30)

输入图像为灰度图,为保护原图像,操作之前对图像进行复制。
第一步,获取原始图像的robot锐化结果。
第二步,将原始灰度图result中,robot锐化结果大于等于阈值T的点置T,小于阈值T的不予操作。

def butterworth_lg_sharpen(src, T=30):
    result = src.copy()
    robot_img = robot_sharpen(result)
    width, height = result.shape
    for i in range(width):
        for j in range(height):
            if robot_img[i][j] >= T:
                result[i][j] = T
    return result
上一篇下一篇

猜你喜欢

热点阅读