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

Python處理圖片并實(shí)現(xiàn)生成天際線

 更新時(shí)間:2024年01月31日 09:34:22   作者:jing_zhong  
天際線(SkyLine)顧名思義就是天空與地面的邊界線,這篇文章主要為大家介紹了如何使用Python實(shí)現(xiàn)處理圖片并實(shí)現(xiàn)生成天際線,感興趣的可以了解下

1、天際線簡介

天際線SkyLine)顧名思義就是天空與地面的邊界線,人站在不同的高度,會看到不同的景色和地平線,天空與地面建筑物分離的標(biāo)記線,不得不說,每天抬頭仰望天空,相信大家都可以看到,它的的確確客觀存在,美麗值得欣賞。

2、Python代碼

#-*- coding:utf-8 -*-
import sys
from os.path import exists
import cv2
import numpy as np

def getImage(height, width, channels):
    image = np.zeros([height, width, 3], np.uint8) # 三通道順序是BGR
    # 三層循環(huán)逐個(gè)修改像素點(diǎn)
    for row in range(height):
        for col in range(width):
                for c in range(channels):
                    image[row, col, c] = 0
    return image

def isWhite(pixel_value, threshold): #閾值可以取10、20、30、50、100
    res = False
    if pixel_value[0] > threshold and pixel_value[1] > threshold and pixel_value[2] > threshold: # 10、10、10 50、50、50 這里是天空和地面樓山的分界線,需要調(diào)參
        res = True
    return res

def isPureWhite(pixel_value):
    res = False
    if pixel_value[0] == 255 and pixel_value[1] == 255 and pixel_value[2] == 255: # >3|>3|>3 10、10、10
        res = True
    return res

def getRowNumberSpecificCol(image, col):
    res_row = -1
    height, width = image.shape[0:2]
    if col >= 0 and col < width:
        for row in range(0, height):
            pv = image[row][col]
            if(pv[0] > 0 and pv[1] > 0 and pv[2] >0):
                res_row = row
                break
    return res_row

def getEnhancedEdgeImageFromEdgeImage(edge_Image):
    edge_SrcImage = edge_Image
    height, width = edge_SrcImage.shape[0:2]
    for col in range(1, width):
        for row in range(0, height):
            pixel_value = edge_SrcImage[row][col]  # 計(jì)算紅綠藍(lán)三波段的平均值
            if isPureWhite(pixel_value):
                r_last = getRowNumberSpecificCol(edge_SrcImage, col - 1)
                if r_last:
                    if row > r_last:
                        minR, maxR = r_last, row
                        for k in range(minR, maxR):
                            edge_SrcImage[k][col - 1][0] = 255
                            edge_SrcImage[k][col - 1][1] = 255
                            edge_SrcImage[k][col - 1][2] = 255
                    else:
                        minR, maxR = row, r_last
                        for k in range(minR, maxR):
                            edge_SrcImage[k][col][0] = 255
                            edge_SrcImage[k][col][1] = 255
                            edge_SrcImage[k][col][2] = 255
    # cv2.imshow("Enhanced-edge-image", edge_SrcImage)
    return edge_SrcImage

def getFileExtensionname(filename):
    res = ".png"
    dot_index = -1
    for i in range(len(filename), 0):
        if filename[i] == '.':
            dot_index = i
            break
    if dot_index != -1:
        res = filename[dot_index: len(filename)-1]
    return res

if __name__ == '__main__':
    origin_pic_filename = "D:/test.png"
    sky_ground_threshold = 30
    isDownSampling = False
    if (len(sys.argv) == 1):
        print(sys.argv[0])
        origin_pic_filename = ""
    elif(len(sys.argv) == 2):
        origin_pic_filename = str(sys.argv[1])
    elif(len(sys.argv) == 3):
        origin_pic_filename = str(sys.argv[1])
        sky_ground_threshold = int(sys.argv[2])
    elif (len(sys.argv) == 4):
        origin_pic_filename = str(sys.argv[1])
        sky_ground_threshold = int(sys.argv[2])
        if(int(sys.argv[3]) == 1):
            isDownSampling = True
    if origin_pic_filename != "" and sky_ground_threshold > 0:
        print(("輸入圖片文件名為:{0}").format(origin_pic_filename))
        print(("天空地面分界灰度閾值為:{0}").format(sky_ground_threshold))
        suffix_name = getFileExtensionname(origin_pic_filename)
        print(("后綴名為:{0}").format(suffix_name))

        srcImage = cv2.imread(origin_pic_filename)
        inputSrcImage = srcImage
        if isDownSampling:
            inputSrcImage = cv2.pyrDown(inputSrcImage)
        height, width = inputSrcImage.shape[0:2]
        print(("高度:{0}, 寬度:{1}").format(height, width))
        cv2.namedWindow('downsampling-image', cv2.WINDOW_AUTOSIZE)
        cv2.imshow("downsampling-image", inputSrcImage)
        Sobelx = cv2.Sobel(inputSrcImage, cv2.CV_64F, 1, 0)
        Sobely = cv2.Sobel(inputSrcImage, cv2.CV_64F, 0, 1)
        Sobelx = cv2.convertScaleAbs(Sobelx)
        Sobely = cv2.convertScaleAbs(Sobely)
        # cv2.imshow("sobel-x-Abs", Sobelx)
        # cv2.imshow("sobel-y-Abs", Sobely)
        Sobelxy = cv2.addWeighted(Sobelx, 0.5, Sobely, 0.5, 0)
        cv2.namedWindow('sobel-xy', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('sobel-xy', Sobelxy)
        edgeImage = getImage(height, width, 3)
        for col in range(0, width):
            for row in range(0, height):
                pixel_value = Sobelxy[row][col]  # 計(jì)算紅綠藍(lán)三波段的平均值
                if isWhite(pixel_value, sky_ground_threshold):
                    edgeImage[row][col][0] = 255
                    edgeImage[row][col][1] = 255
                    edgeImage[row][col][2] = 255
                    break
        cv2.namedWindow('edge-image', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('edge-image', edgeImage)
        cv2.imwrite(origin_pic_filename.replace(suffix_name, "-ZGetEdge.png"), edgeImage)
        enhanced_edgeImage = getEnhancedEdgeImageFromEdgeImage(edgeImage)
        cv2.namedWindow('enhanced-edge-image', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('enhanced-edge-image', enhanced_edgeImage)
        cv2.imwrite(origin_pic_filename.replace(suffix_name, "-EnhancedEdge.png"), enhanced_edgeImage)

        for col in range(0, width):
            for row in range(0, height):
                pixel_value = enhanced_edgeImage[row][col]  # 計(jì)算紅綠藍(lán)三波段的平均值
                if isPureWhite(pixel_value):
                    if row+2 < height:
                        inputSrcImage[row+2][col][0] = 0
                        inputSrcImage[row+2][col][1] = 0
                        inputSrcImage[row+2][col][2] = 255
                    else:
                        inputSrcImage[row][col][0] = 0
                        inputSrcImage[row][col][1] = 0
                        inputSrcImage[row][col][2] = 255
                    # inputSrcImage[row][col][0] = 0
                    # inputSrcImage[row][col][1] = 0
                    # inputSrcImage[row][col][2] = 255
                    # break #最開始從每列遍歷從上到下找第一個(gè)分界點(diǎn)就停止才用break

        cv2.namedWindow('RedEdge-image', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RedEdge-image', inputSrcImage)
        cv2.imwrite(origin_pic_filename.replace(suffix_name, "-RedEdge.png"), inputSrcImage)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        print('Success!')
        cv2.waitKey()
        cv2.destroyAllWindows()

3、運(yùn)行結(jié)果

3.1 非下采樣+邊緣檢測

python GetSkyLine.py test.jpg  100

原始圖片

邊緣點(diǎn)圖片

邊緣增強(qiáng)圖片

sobel-xy處理后圖片

downloadsampling圖片

紅色邊緣疊加圖片

3.2 下采樣+邊緣檢測

python GetSkyLine.py test.jpg  50  1

原始圖片

邊緣點(diǎn)圖片

邊緣增強(qiáng)圖片

downloadsampling圖片

sobel-xy處理后圖片

紅色邊緣疊加圖片

到此這篇關(guān)于Python處理圖片并實(shí)現(xiàn)生成天際線的文章就介紹到這了,更多相關(guān)Python圖片天際線內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python根據(jù)歐拉角求旋轉(zhuǎn)矩陣的實(shí)例

    Python根據(jù)歐拉角求旋轉(zhuǎn)矩陣的實(shí)例

    今天小編就為大家分享一篇Python根據(jù)歐拉角求旋轉(zhuǎn)矩陣的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python連接MinIO的完整指南

    Python連接MinIO的完整指南

    MinIO作為高性能的分布式對象存儲系統(tǒng),憑借與Amazon S3兼容的API和云原生架構(gòu),成為企業(yè)級數(shù)據(jù)存儲的優(yōu)選方案,本文將系統(tǒng)講解Python連接MinIO的全流程,涵蓋從環(huán)境搭建到生產(chǎn)部署的完整實(shí)踐路徑,需要的朋友可以參考下
    2025-09-09
  • Python利用PyAutoGUI模塊實(shí)現(xiàn)控制鼠標(biāo)鍵盤

    Python利用PyAutoGUI模塊實(shí)現(xiàn)控制鼠標(biāo)鍵盤

    PyAutoGUI是一個(gè)簡單易用,跨平臺的可以模擬鍵盤鼠標(biāo)進(jìn)行自動操作的python庫。本文將詳細(xì)講講它是如何實(shí)現(xiàn)控制鼠標(biāo)鍵盤的,感興趣的可以了解一下
    2022-06-06
  • python列表添加元素append(),extend(),insert(),+list的區(qū)別及說明

    python列表添加元素append(),extend(),insert(),+list的區(qū)別及說明

    這篇文章主要介紹了python列表添加元素append(),extend(), insert(),+list的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 基于Django框架利用Ajax實(shí)現(xiàn)點(diǎn)贊功能實(shí)例代碼

    基于Django框架利用Ajax實(shí)現(xiàn)點(diǎn)贊功能實(shí)例代碼

    點(diǎn)贊這個(gè)功能是我們現(xiàn)在經(jīng)常會遇到的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于基于Django框架利用Ajax實(shí)現(xiàn)點(diǎn)贊功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Python之os模塊案例詳解

    Python之os模塊案例詳解

    這篇文章主要介紹了Python之os模塊案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 詳解python的內(nèi)存分配機(jī)制

    詳解python的內(nèi)存分配機(jī)制

    Python的內(nèi)存分配機(jī)制是小白們最需要理解的概念之一。創(chuàng)建對象(變量、函數(shù)、對象等)后,CPython會在內(nèi)存中為其分配地址。Python有一個(gè)id()函數(shù),它可以返回對象的“身份”,也就是內(nèi)存地址。它實(shí)際上是一個(gè)唯一的整數(shù)。
    2021-05-05
  • Python讀取Excel的方法實(shí)例分析

    Python讀取Excel的方法實(shí)例分析

    這篇文章主要介紹了Python讀取Excel的方法,實(shí)例分析了Python操作Excel文件的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Django框架實(shí)現(xiàn)的分頁demo示例

    Django框架實(shí)現(xiàn)的分頁demo示例

    這篇文章主要介紹了Django框架實(shí)現(xiàn)的分頁demo,結(jié)合實(shí)例形式分析了Django框架分頁的步驟、原理、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • Python socket編程實(shí)例詳解

    Python socket編程實(shí)例詳解

    這篇文章主要介紹了Python socket編程,以實(shí)例形式較為詳細(xì)的分析了Python中socket模塊的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05

最新評論

锦州市| 潜山县| 巴林左旗| 宜兰县| 香河县| 嘉禾县| 宜春市| 库车县| 永仁县| 峨山| 临邑县| 阿勒泰市| 邵东县| 西林县| 西乌珠穆沁旗| 北海市| 古丈县| 开阳县| 韶关市| 通城县| 四川省| 门源| 东城区| 延安市| 湘阴县| 迭部县| 乌鲁木齐县| 陕西省| 永昌县| 平安县| 连州市| 顺义区| 巴彦县| 雷州市| 黑水县| 阿坝| 内丘县| 鄄城县| 阳信县| 博爱县| 启东市|