圖像基本操作(濾波荤胁,平滑,銳化屎债,輪廓提取等)

這里一共包含了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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屁倔,隨后出現(xiàn)的幾起案子脑又,更是在濱河造成了極大的恐慌,老刑警劉巖锐借,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件问麸,死亡現(xiàn)場離奇詭異,居然都是意外死亡钞翔,警方通過查閱死者的電腦和手機(jī)严卖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來布轿,“玉大人哮笆,你說我怎么就攤上這事来颤。” “怎么了稠肘?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵福铅,是天一觀的道長。 經(jīng)常有香客問我启具,道長本讥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任鲁冯,我火速辦了婚禮,結(jié)果婚禮上色查,老公的妹妹穿的比我還像新娘薯演。我一直安慰自己,他們只是感情好秧了,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布跨扮。 她就那樣靜靜地躺著,像睡著了一般验毡。 火紅的嫁衣襯著肌膚如雪衡创。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天晶通,我揣著相機(jī)與錄音璃氢,去河邊找鬼。 笑死狮辽,一個胖子當(dāng)著我的面吹牛一也,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喉脖,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼椰苟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了树叽?” 一聲冷哼從身側(cè)響起舆蝴,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎题诵,沒想到半個月后洁仗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仇轻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年京痢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篷店。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡祭椰,死狀恐怖臭家,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情方淤,我是刑警寧澤钉赁,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站携茂,受9級特大地震影響你踩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讳苦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一带膜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸳谜,春花似錦膝藕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝗肪,卻和暖如春袜爪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薛闪。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工辛馆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逛绵。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓怀各,卻偏偏與公主長得像,于是被迫代替她去往敵國和親术浪。 傳聞我的和親對象是個殘疾皇子瓢对,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容