最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python如何去除圖像中的框

 更新時(shí)間:2023年11月08日 10:09:50   作者:weixin_37763484  
最近在做圖像標(biāo)注,會(huì)出現(xiàn)帶框的圖片,需要去除其中的邊框,本文通過實(shí)例代碼給大家介紹python如何去除圖像中的框,感興趣的朋友跟隨小編一起看看吧

最近在做圖像標(biāo)注,會(huì)出現(xiàn)以下的圖片,需要去除其中的邊框。

1.思路

  • 人工標(biāo)注畫框的范圍P,并使用標(biāo)注工具在畫框上畫一個(gè)點(diǎn)A。
  • 獲取點(diǎn)A的坐標(biāo)和顏色。在范圍P內(nèi),將與點(diǎn)A顏色相似的每一個(gè)點(diǎn)x的顏色,替換為點(diǎn)x上下(或左右)范圍內(nèi)若干個(gè)點(diǎn)的平均顏色。但是對(duì)于邊緣部分,可能存在如下圖所示的問題:

對(duì)邊框的邊緣部分Q進(jìn)行額外處理。邊框的顏色可能與點(diǎn)A的顏色有較大差異,因此需要利用其他方法進(jìn)行處理。我使用異常值檢測(cè)算法,因?yàn)镼中未在步驟2去除的一些殘留點(diǎn),與原始圖片會(huì)存在較大差異,結(jié)合頻度信息可以篩選出這些點(diǎn),并得到以下的效果:

2.代碼實(shí)現(xiàn)

1.導(dǎo)包和必要的參數(shù)、模型:

from PIL import Image
import numpy as np
from sklearn.ensemble import IsolationForest
from collections import Counter
# 判斷rgb相似度用,可以小一些
threhold=15
threhold_border=15
# 采樣半徑,可以設(shè)的小一些,可以根據(jù)邊框的粗細(xì)來設(shè)定
redius=20
redius_border=20
# 對(duì)邊框進(jìn)行處理需要調(diào)整的參數(shù)
step_add=37
step_max=2000
step=0
all_outliers=[]
top_outlier_num=10
# 創(chuàng)建Isolation Forest模型
model = IsolationForest(contamination=0.05)  # 設(shè)置異常點(diǎn)的比例

2.輔助函數(shù)

#判斷顏色是否相似
def my_similar(a,b):
    if sum([abs(x-y) for (x,y) in zip(list(a),list(b))])/3<threhold:
        return True
    return False
# 判斷顏色是否相似
def my_similar_border(a,b_s):
    for b in b_s:
        if sum([abs(x-y) for (x,y) in zip(list(a),list(b)[0])])/3<threhold_border:
            return True
    return False
# 獲取異常值,用于處理邊框的邊緣Q
def get_outlier(tmp,model):
    normal_point=[]
    unnormal_point=[]
    # 將數(shù)據(jù)傳遞給模型進(jìn)行訓(xùn)練
    model.fit(tmp)
    # 獲取每個(gè)數(shù)據(jù)點(diǎn)的預(yù)測(cè)標(biāo)簽,-1 表示異常點(diǎn),1 表示正常點(diǎn)
    labels = model.predict(tmp)
    # 打印每個(gè)數(shù)據(jù)點(diǎn)的標(biāo)簽
    for i, label in enumerate(labels):
        if label == -1:
            unnormal_point.append(tmp[i])
        if label==1:
            normal_point.append(tmp[i])
    return normal_point,unnormal_point
# 在水平或處置方向上獲取鄰居節(jié)點(diǎn),以便進(jìn)行顏色替換
def get_right_neighborhood(target_color,neighborhood_x,neighborhood_y):
    diff_x=0
    diff_y=0
    for neighborhood in neighborhood_x:
        diff_x+=abs(sum([x-y for x,y in zip(list(neighborhood),list(target_color))])/3)
    for neighborhood in neighborhood_y:
        diff_y+=abs(sum([x-y for x,y in zip(list(neighborhood),list(target_color))])/3)
    if diff_x>diff_y:
        return neighborhood_x,1
    return neighborhood_y,2

3.主函數(shù)和必要的準(zhǔn)備數(shù)據(jù)

########################################################################################
############################開始對(duì)區(qū)域P和點(diǎn)A進(jìn)行人工指定################################
################################對(duì)應(yīng)“思路”第1部分#####################################
########################################################################################
# 利用手動(dòng)或利用labelimg等標(biāo)注工具,
# 確定“思路”第1部分中的區(qū)域“P”
#人工框選畫框的大致位置,需要包裹住畫框
x_1=1427
y_1=723
x_2=2061
y_2=1363
# 利用手動(dòng)或利用labelimg等標(biāo)注工具,
# 確定“思路”第1部分中的點(diǎn)“A”
x = 1495 # 目標(biāo)像素點(diǎn)的 x 坐標(biāo)
y = 1294 # 目標(biāo)像素點(diǎn)的 y 坐標(biāo)
# 主要函數(shù)
def replace_color_around_point(image_path, x, y, radius=redius):
    # 采樣步數(shù)
    step=0
    # 打開圖像
    image = Image.open(image_path)
    pixels = image.load()
    # 獲取圖像的寬度和高度
    width, height = image.size
    ########################################################################################
    ############################開始對(duì)邊框的內(nèi)部節(jié)點(diǎn)進(jìn)行處理################################
    ################################對(duì)應(yīng)“思路”第2部分#####################################
    ########################################################################################
    # 獲取目標(biāo)像素點(diǎn)的顏色
    target_color = pixels[x, y]
    # 循環(huán)遍歷圖像中的每個(gè)像素點(diǎn)
    for i in range(x_1,x_2):
        for j in range(y_1,y_2):
            # 如果像素顏色與目標(biāo)顏色相同,則替換為周圍區(qū)域顏色的平均值
            if my_similar(pixels[i, j],target_color):
                # 計(jì)算周圍水平和垂直區(qū)域的顏色平均值
                neighborhood_x = []
                neighborhood_y=[]
                for m in range(i - redius, i + radius + 1):
                        if 0 <= m < width:
                            neighborhood_x.append(pixels[m, j])
                for n in range(j - redius, j + radius + 1):
                        if 0 <= n < height:
                            neighborhood_y.append(pixels[i, n])
                neighborhood,direction=get_right_neighborhood(target_color,neighborhood_x,neighborhood_y)
                neighborhood=[n for n in neighborhood if not my_similar(n,target_color)]
                neighborhood = np.array(neighborhood)
                average_color=tuple(np.mean(neighborhood, axis=0, dtype=int))
                average_color_part_1 = tuple(np.mean(neighborhood[0:int(len(neighborhood)/2)], axis=0, dtype=int))
                average_color_part_2 = tuple(np.mean(neighborhood[int(len(neighborhood)/2)+1:], axis=0, dtype=int))
                # 替換像素顏色
                pixels[i, j] = average_color
                # 如果是水平方向
                if direction==1:
                    for m in range(i - int(redius_border/3), i):
                        if 0 <= m < width:
                                pixels[m,j]=average_color_part_1
                    for m in range(i, i + int(redius_border/3) + 1):
                        if 0 <= m < width:
                                pixels[m,j]=average_color_part_2
                # 如果是垂直方向
                if direction==2:            
                    for n in range(j - int(redius_border/3), j):
                        if 0 <= n < height:
                                pixels[i,n]=average_color_part_1
                    for n in range(j ,j + int(redius_border/3) + 1):
                        if 0 <= n < height:
                                pixels[i,n]=average_color_part_2
                step+=1
                if step%step_add==0 and step<step_max:
                    normal_point,unnormal_point=get_outlier(neighborhood,model)
                    unnormal_point=[tuple(x) for x in unnormal_point]
                    all_outliers.extend(unnormal_point)
    ########################################################################################
    ############################開始對(duì)邊框的邊緣節(jié)點(diǎn)進(jìn)行處理################################
    ################################對(duì)應(yīng)“思路”第2部分#####################################
    ########################################################################################
    # 使用Counter來統(tǒng)計(jì)三元組的出現(xiàn)次數(shù)
    all_outlier_counts = Counter(all_outliers)
    # 獲取出現(xiàn)次數(shù)最多的十個(gè)三元組,用來去邊框
    top_outliers = all_outlier_counts.most_common(top_outlier_num)
    # 循環(huán)遍歷圖像中的每個(gè)像素點(diǎn)
    for i in range(x_1,x_2):
        for j in range(y_1,y_2):
            # 如果該點(diǎn)和異常點(diǎn)中的顏色相似,就進(jìn)行替換
            if my_similar_border(pixels[i, j] ,top_outliers):
                # 計(jì)算周圍水平和垂直區(qū)域的顏色平均值
                neighborhood_x = []
                neighborhood_y=[]
                for m in range(i - int(radius/3), i + int(radius/3) + 1):
                        if 0 <= m < width:
                            neighborhood_x.append(pixels[m, j])
                for n in range(j - int(radius/3), j + int(radius/3) + 1):
                        if 0 <= n < height:
                            neighborhood_y.append(pixels[i, n])
                neighborhood,direction=get_right_neighborhood(target_color,neighborhood_x,neighborhood_y)
                neighborhood=[n for n in neighborhood if not n in top_outliers]
                neighborhood = np.array(neighborhood)
                average_color=tuple(np.mean(neighborhood, axis=0, dtype=int))
                # 替換像素顏色
                pixels[i, j] = average_color
    # 保存修改后的圖像
    image.save(r"../data/bbb.jpg")

4.調(diào)用

image_path = r"../data/aaa.jpg"  # 替換為您的輸入圖像路徑
replace_color_around_point(image_path, x, y)

3.存在的問題

1.在進(jìn)行顏色替換時(shí),僅僅使用了平均值(代碼中的average_color相關(guān)內(nèi)容),也許可以使用其他線性插值算法。

2.需要對(duì)參數(shù)進(jìn)行精心調(diào)節(jié),否則可能導(dǎo)致框內(nèi)的圖像會(huì)出現(xiàn)以下的“毛刺現(xiàn)象”,且無法把“框”完全去除:

將threhold參數(shù)調(diào)小后,毛刺消失。也可以對(duì)其他參數(shù)進(jìn)行調(diào)節(jié)。

到此這篇關(guān)于python 去除圖像中的框的文章就介紹到這了,更多相關(guān)python 去除圖像中的框內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python全字段斷言之DeepDiff模塊詳解

    Python全字段斷言之DeepDiff模塊詳解

    這篇文章主要介紹了Python全字段斷言之DeepDiff模塊詳解,Python中也提供了deepdiff庫,常用來校驗(yàn)兩個(gè)對(duì)象是否一致,包含3個(gè)常用類,DeepDiff,DeepSearch和DeepHash,,需要的朋友可以參考下
    2023-08-08
  • Python3中安裝后SSL問題及解決

    Python3中安裝后SSL問題及解決

    這篇文章主要介紹了Python3中安裝后SSL問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python中pivot()函數(shù)基礎(chǔ)知識(shí)點(diǎn)

    python中pivot()函數(shù)基礎(chǔ)知識(shí)點(diǎn)

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python中pivot()函數(shù)基礎(chǔ)知識(shí)點(diǎn)內(nèi)容,對(duì)此有興趣的朋友們可以參考學(xué)習(xí)下。
    2021-01-01
  • Python基于LightGBM進(jìn)行時(shí)間序列預(yù)測(cè)

    Python基于LightGBM進(jìn)行時(shí)間序列預(yù)測(cè)

    LightGBM是擴(kuò)展機(jī)器學(xué)習(xí)系統(tǒng)。是一款基于GBDT(梯度提升決策樹)算法的分布梯度提升框架。其設(shè)計(jì)思路主要集中在減少數(shù)據(jù)對(duì)內(nèi)存與計(jì)算性能的使用上,以及減少多機(jī)器并行計(jì)算時(shí)的通訊代價(jià)。本文將通過LightGBM進(jìn)行時(shí)間序列預(yù)測(cè),感興趣的可以了解一下
    2022-03-03
  • Python中的raise關(guān)鍵字詳解

    Python中的raise關(guān)鍵字詳解

    這篇文章主要介紹了Python中的raise關(guān)鍵字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • python批量處理URL并提取內(nèi)容且按序保存到本地

    python批量處理URL并提取內(nèi)容且按序保存到本地

    這篇文章主要為大家詳細(xì)介紹了如何使用python實(shí)現(xiàn)批量處理URL并提取內(nèi)容且按序保存到本地,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-07-07
  • Python實(shí)現(xiàn)單例模式的多種方法總結(jié)

    Python實(shí)現(xiàn)單例模式的多種方法總結(jié)

    單例模式是最常使用的一種設(shè)計(jì)模式,該模式的目的是確保在一個(gè)系統(tǒng)中,一個(gè)類只有一個(gè)實(shí)例,本文給大家介紹了Python實(shí)現(xiàn)單例模式的完整指南:原理、方法與最佳實(shí)踐,需要的朋友可以參考下
    2025-04-04
  • tensorflow轉(zhuǎn)換ckpt為savermodel模型的實(shí)現(xiàn)

    tensorflow轉(zhuǎn)換ckpt為savermodel模型的實(shí)現(xiàn)

    這篇文章主要介紹了tensorflow轉(zhuǎn)換ckpt為savermodel模型的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過來看看吧
    2020-05-05
  • Python+MySQL隨機(jī)試卷及答案生成程序的示例代碼

    Python+MySQL隨機(jī)試卷及答案生成程序的示例代碼

    這篇文章主要介紹了Python+MySQL隨機(jī)試卷及答案生成程序的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • python+django加載靜態(tài)網(wǎng)頁模板解析

    python+django加載靜態(tài)網(wǎng)頁模板解析

    這篇文章主要介紹了python+django加載靜態(tài)網(wǎng)頁模板解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論

天峻县| 济阳县| 光山县| 泸水县| 宜川县| 威远县| 平度市| 万山特区| 顺昌县| 车致| 天峨县| 澜沧| 松滋市| 潼关县| 开原市| 阳谷县| 周至县| 晋城| 福鼎市| 灯塔市| 肇东市| 桐庐县| 武清区| 铜川市| 云霄县| 滦平县| 土默特右旗| 清原| 五峰| 永德县| 永宁县| 柘城县| 聂拉木县| 淅川县| 海兴县| 江门市| 高邮市| 石渠县| 木兰县| 泗水县| 勐海县|