這里一共包含了7種銳化方法仅政,3種濾波方法,一種平滑方法盆驹,以及三種具體的功能實(shí)現(xiàn)圆丹,常用的基本圖像操作基本都全了。直接上碼召娜。
1 直方圖均衡化 histogram_equalize(src)
輸入圖像為灰度圖运褪。
第一步,實(shí)現(xiàn)了對各個灰度級數(shù)量的計(jì)算玖瘸。
第二步秸讹,實(shí)現(xiàn)了對灰度級累計(jì)分布的計(jì)算。
第三步雅倒,將累計(jì)概率函數(shù)放大到0~255的區(qū)間璃诀,對于放大過程中大于255的灰度值置255,小于0的置0.
第四步蔑匣,進(jìn)行灰度映射轉(zhuǎn)換劣欢。
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
# 計(jì)算各個灰度級數(shù)量
for index, value in enumerate(gray_flat):
count_pixel[value] += 1
# 計(jì)算灰度級的累計(jì)分布
for i in range(256):
if i == 0:
temp[0] = count_pixel[0]
else:
temp[i] = temp[i - 1] + count_pixel[i]
# 計(jì)算累計(jì)概率函數(shù),并把值擴(kuò)展到0~255
value = 255.0 * (temp[i] / image_bytes)
if value > 255:
value = 255
if value < 0:
value = 0
pixmap[i] = value
# 灰度等級映射轉(zhuǎn)換
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])
輸入圖像為灰度圖裁良,為保護(hù)原圖像凿将,操作之前對圖像進(jìn)行復(fù)制。
第一步价脾,獲取原始圖像的robot銳化結(jié)果牧抵。
第二部,對于像素值大于等于T的像素點(diǎn)置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])
輸入圖像為灰度圖妹孙,為保護(hù)原圖像,操作之前對圖像進(jìn)行復(fù)制获枝。
對于圖像中像素值大于等于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])
輸入圖像為灰度圖,為保護(hù)原圖像省店,操作之前對圖像進(jìn)行復(fù)制嚣崭。
此方法中調(diào)用了opencv中的種植濾波函數(shù)。
def median_filter(src, k_size=3):
result = src.copy()
return cv2.medianBlur(result, k_size)
5 高斯濾波 gaussian_filter(src[, k_size=3])
輸入圖像為灰度圖萨西,為保護(hù)原圖像有鹿,操作之前對圖像進(jìn)行復(fù)制。
方法中對于輸入的size轉(zhuǎn)換為了可以被opencv中高斯濾波函數(shù)識別的高斯核谎脯,繼而進(jìn)行了高斯濾波操作葱跋。
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])
輸入圖像為灰度圖,為保護(hù)原圖像源梭,操作之前對圖像進(jìn)行復(fù)制娱俺。
方法中將輸入的k_size轉(zhuǎn)化為size元組,繼而直接調(diào)用opencv中的均值濾波函數(shù)废麻。
def blur_filter(src, k_size=3):
result = src.copy()
size = (k_size, k_size)
return cv2.blur(result, size)
7 拉普拉斯銳化 laplace_sharpen(src)
輸入圖像為灰度圖荠卷,為保護(hù)原圖像,操作之前對圖像進(jìn)行復(fù)制烛愧。
直接調(diào)用opencv內(nèi)部的laplace銳化函數(shù)油宜,對轉(zhuǎn)化后的結(jié)果取絕對值,繼而返回銳化后的圖像怜姿。
def laplace_sharpen(src):
result = src.copy()
return cv2.convertScaleAbs(cv2.Laplacian(result, -1))
8 sobel銳化 sobel_sharpen(src)
輸入圖像為灰度圖慎冤,為保護(hù)原圖像,操作之前對圖像進(jìn)行復(fù)制沧卢。
獲取x方向和y方向上的sobel銳化結(jié)果蚁堤,返回sobel_x和sobel_y的和,即為sobel銳化結(jié)果但狭。
此操作可用于實(shí)現(xiàn)圖像邊緣提取披诗。
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)
輸入圖像為灰度圖,為保護(hù)原圖像立磁,操作之前對圖像進(jìn)行復(fù)制呈队。
第一步,定義x方向和y方向上的兩個銳化模板唱歧。
第二步掂咒,使用兩個模板分別對圖像進(jìn)行filter2D的濾波操作,返回dst_x和dst_y兩個結(jié)果迈喉。
第三步绍刮,返回兩個圖像之和,即為prewitt銳化結(jié)果挨摸。
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)
輸入圖像為灰度圖孩革,為保護(hù)原圖像,操作之前對圖像進(jìn)行復(fù)制得运。
第一步膝蜈,定義兩個銳化模板kernel_x和kernel_y。
第二步熔掺,分別使用兩個銳化模板對原始圖像進(jìn)行濾波操作饱搏,得到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)]
輸入圖像為灰度圖,為保護(hù)原圖像券坞,操作之前對圖像進(jìn)行復(fù)制鬓催。
第一步宵呛,新建一個全0模板mask弦悉,將以模板中心為中,邊長為2*radius的正方形置于1碉京。
第二步猴伶,快速傅里葉變換课舍,空域轉(zhuǎn)頻域。
第三步他挎,使用mask模板對頻域圖像進(jìn)行濾波筝尾。
第四步,頻域轉(zhuǎn)空域雇盖,反快速傅里葉變換忿等。
第五步,對上一步的到的圖像進(jìn)行取絕對值操作崔挖。
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])
輸入圖像為灰度圖贸街,為保護(hù)原圖像,操作之前對圖像進(jìn)行復(fù)制狸相。
第一步薛匪,新建一個全1模板mask,將以模板中心為中脓鹃,邊長為2*radius的正方形置于0逸尖。
第二步,快速傅里葉變換,空域轉(zhuǎn)頻域娇跟。
第三步岩齿,使用mask模板對頻域圖像進(jìn)行濾波。
第四步苞俘,頻域轉(zhuǎn)空域盹沈,反快速傅里葉變換。
第五步吃谣,對上一步的到的圖像進(jìn)行取絕對值操作乞封。
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])
輸入圖像為灰度圖,為保護(hù)原圖像岗憋,操作之前對圖像進(jìn)行復(fù)制肃晚。
第一步,獲取原始圖像的robot銳化結(jié)果仔戈。
第二步关串,將原始灰度圖result中,robot銳化結(jié)果小于閾值T的點(diǎn)置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)
輸入圖像為灰度圖,為保護(hù)原圖像耐量,操作之前對圖像進(jìn)行復(fù)制飞蚓。
第一步,獲取原始圖像的robot銳化結(jié)果廊蜒。
第二步趴拧,將原始灰度圖result中,robot銳化結(jié)果大于等于閾值T的點(diǎn)置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