0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Python进行图像处理

新机器视觉 来源:磐创AI 2024-11-07 10:14 次阅读

来源:磐创AI

下面是一个关于使用Python在几行代码中分析城市轮廓线的快速教程

说一句显而易见的话:轮廓线很美。

在本文中,我们将学习如何从图片中获取轮廓线轮廓。

让我们开始吧。

0.理念

这个想法很简单。为了检测轮廓线,我们只检测天空并拍摄互补图像。

在你之前看到的示例中,我们真正做的是识别天空。下一步当然是获取蒙版图像。

那么,为什么探测天空比探测摩天大楼更容易呢?

好吧,这个概念是天空的图片是相对平坦的。另一方面,摩天大楼是颜色、形状、窗户、水泥等的混合体。

从数学上讲,天空的方差比摩天大楼的方差小,并且期望该参数在区分天空和摩天大楼时起决定性作用。

我想用一个例子来证明我所说的话。让我们拍下这张照片。

太棒了现在,让我们在这个区域修剪这张图片:

现在,让我们从0到50之间取一部分并打印标准偏差:

该方差变化可以使用二阶导数来检测。

当我们讨论离散二维情况时,我们实际上是在讨论拉普拉斯算子。拉普拉斯算子可以被视为卷积,这只是使用泰勒近似的导数的定义。

进入下一节的主题。

1.算法

执行图(1)中所示操作的算法如下:

52b7469c-909b-11ef-a511-92fbcf53809c.png

我明白这是一团糟。让我一步一步地解释一下。

1.1将图像转换为黑白

我知道你知道这一切。但重要的是要说明我们为什么要这样做。正如你所知,当你将它们应用于矩阵时,所有的模糊步骤和过滤都是有意义的。彩色图像在技术上是一个张量,因为它具有行数X列数X 3个通道值(红、绿和蓝)。B&W图像是由行数X列数组成的矩阵。

将此应用于彩色图像的一个简单方法是重复上述相同的过程三次,但我认为没有必要。最终,即使使用B&W图像,我们也能分辨出轮廓线。

1.2模糊步骤

中值和归一化滤波器步骤都是用于在保持边的同时对信号的噪声进行滤波的步骤。

1.3拉普拉斯滤波器

拉普拉斯滤波器被认为是离散空间的二阶时间导数。

为什么我们首先需要二阶时间导数?

我们说过,天空和摩天大楼之间的标准差是不同的。这种标准差的变化发生在一个特定的点上,即图像(和摩天大楼)的边缘。

所以我们希望看到图像的快速变化。特别是,我们希望变化最大。这意味着我们需要二阶导数为空的点(或点的邻居)。

当我们讨论离散二维情况时,我们实际上是在讨论拉普拉斯算子。拉普拉斯算子可以被视为卷积,这只是使用泰勒近似的导数的定义。

二阶导数是这样的:

52ecd17c-909b-11ef-a511-92fbcf53809c.png

这是一个核,我们将在图像上运行,它将为我们提供二阶导数图像。

1.4应用1/0阈值

我们不关心二阶导数是正还是负。我们所关心的只是我们有0的一小部分,因为这是我们认为的边缘。

这就是为什么我们应用这个1/0阈值。

1.5侵蚀滤波器

侵蚀滤波器是我们用来平滑图像的东西。这背后的想法是,我们希望使图像更清晰。用更专业的话来说,有一个核在图像上传递,并用它们的最小值替换值。同样,由于我们现在有一张1/0的图像,它只是让我们的图像更清晰。

1.6将掩码设置为0,直到找到最后一个索引

这一步有点难解释,但很容易理解。完成所有这些操作后,图像的一列中可能有一个0和1的序列。这没有太多意义,因为你不能再拥有“skyscraper-sky-skyscraper again”这样的东西了。因此,我们在列中找到值为0的最大索引,并将所有值设置为0,直到找到该值。那么,其他的都是0。

2.实际实现

这解释起来有点长,但非常容易实现。

让我们循序渐进:

importnumpyasnp
importpandasaspd
fromosimportlistdir
fromPILimportImage
importmatplotlib.pyplotasplt
fromos.pathimportisfile,join
importcv2
fromscipy.signalimportmedfilt
fromscipyimportndimage
importnumpyasnp
frommatplotlibimportpyplotasplt
importos
fromsklearn.metricsimportplot_confusion_matrix
fromsklearn.metricsimportconfusion_matrix

2.1导入库:

mypath='data/images'
subfolders=[f.pathforfinos.scandir(mypath)iff.is_dir()]
images=[]
images_baw=[]
labels=[]
label=0
size=256
string_labels=[]
forfolderinsubfolders:
onlyfiles=[fforfinlistdir(folder)ifisfile(join(folder,f))]
forfileinonlyfiles:
image_file=Image.open(folder+'/'+file).resize((size,size))
images.append(np.array(image_file))
images_baw.append(np.array(image_file.convert('1')))
labels.append(label)
string_labels.append(folder.split('/')[-1])
label=label+1
labels=np.array(labels)
images=np.array(images)
image_baw=np.array(images_baw)

2.1导入数据:

我从Kaggle那里得到了数据。数据集是开源的,没有版权(CC0:公共域)。特别是,我只下载了数据集的一部分,其中包含12个城市的图像,每个城市有10座摩天大楼:

mypath='data/images'
subfolders=[f.pathforfinos.scandir(mypath)iff.is_dir()]
images=[]
images_baw=[]
labels=[]
label=0
size=256
string_labels=[]
forfolderinsubfolders:
onlyfiles=[fforfinlistdir(folder)ifisfile(join(folder,f))]
forfileinonlyfiles:
image_file=Image.open(folder+'/'+file).resize((size,size))
images.append(np.array(image_file))
images_baw.append(np.array(image_file.convert('1')))
labels.append(label)
string_labels.append(folder.split('/')[-1])
label=label+1
labels=np.array(labels)
images=np.array(images)
image_baw=np.array(images_baw)

2.2数据可视化

plt.figure(figsize=(20,20))
foriinrange(1,13):
plt.subplot(4,3,i)
identify_label=np.where(labels==i-1)[0]
identify_label=np.random.choice(identify_label)
plt.title('Citylabel=%s'%(string_labels[identify_label]))
plt.imshow(images[identify_label])

2.3定义函数:

以上所有理论都以以下方式实现:

defcal_skyline(mask):
h,w=mask.shape
foriinrange(w):
raw=mask[:,i]
after_median=medfilt(raw,19)
try:
first_zero_index=np.where(after_median==0)[0][0]
first_one_index=np.where(after_median==1)[0][0]
iffirst_zero_index>20:
mask[first_one_index:first_zero_index,i]=1
mask[first_zero_index:,i]=0
mask[:first_one_index,i]=0
except:
continue
returnmask


defget_sky_region_gradient(img):

h,w,_=img.shape

img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

img_gray=cv2.blur(img_gray,(9,3))
cv2.medianBlur(img_gray,5)
lap=cv2.Laplacian(img_gray,cv2.CV_8U)
gradient_mask=(lap< 6).astype(np.uint8)

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3))

    mask = cv2.morphologyEx(gradient_mask, cv2.MORPH_ERODE, kernel)
    # plt.imshow(mask)
    # plt.show()
    mask = cal_skyline(mask)
    after_img = cv2.bitwise_and(img, img, mask=mask)

    return after_img

2.4应用算法

这是算法在整个数据集上的应用:

zero_images=[]
zero_images_plot=[]
forKinrange(len(images)):
zero_image_plot=np.zeros((size,size))
zero_image=zero_image_plot.copy()
foriinrange(size):
zero_image_plot[i,tot_profiles[K][i]-2:tot_profiles[K][i]+2]=1
zero_image[i,tot_profiles[K][i]]=1
zero_images_plot.append(zero_image_plot.T)
zero_images.append(zero_image.T)

示例:

K=0
plt.figure(figsize=(10,10))
plt.suptitle('City=%s'%(string_labels[K]),fontsize=20,y=0.72)
plt.subplot(1,3,1)
plt.title('OriginalImage')
plt.imshow(images[K])
plt.subplot(1,3,3)
plt.title('MaskedImage')
plt.imshow(zero_images_plot[0])
plt.subplot(1,3,2)
plt.title('ProfiledSkyline')
plt.imshow(get_sky_region_gradient(images[K]))

2.5将其转换为信号

为了获得图像(1)的正确图像,我们应用以下函数:

defsignal_from_profile(K):
x=np.arange(size)
y=np.array(size-np.array(tot_profiles[K]))
returnx,y

我们可以将其应用于数据集的所有图像:

plt.figure(figsize=(13,10))
#plt.suptitle('City=%s'%(string_labels[K]),fontsize=20)
i=0
forqinrange(3):
K=np.random.choice(len(images))
#print(K)
skyline_signal_x,skyline_signal_y=signal_from_profile(K)
plt.subplot(4,4,i+1)
plt.title('OriginalImage')
plt.imshow(images[K])
plt.subplot(4,4,i+3)
plt.title('MaskedImage')
plt.imshow(zero_images_plot[K])
plt.subplot(4,4,i+2)
plt.title('ProfiledSkyline')
plt.imshow(get_sky_region_gradient(images[K]))
plt.subplot(4,4,i+4)
plt.title('ExtractedSignal')
plt.plot(skyline_signal_x,skyline_signal_y)
plt.tight_layout()
i=i+4

3.结尾

我认为这项研究之所以有趣,有多种原因。首先,这很有趣,因为有两个理论上合理的理由。

它解释了如何使用拉普拉斯滤波器以非深度学习的方式应用边缘检测

它解释了如何使用图像进行从头到脚的实验,以及如何创建一个有效的图像处理管道

当然,这本身很有趣,因为它为你提供了一个分析不同城市轮廓线的工具!

你可以看到,城市A和城市B有不同的概况,特别是使用提取的信号,我们可以通过以下方式深化这项研究:

提取轮廓线的平均值、中值和标准差

使用深度学习对城市轮廓线进行分类

对轮廓线与时间进行统计研究(轮廓线如何随时间演变?)

记住,这个项目背后的整个想法是,天空的标准差比摩天大楼的标准差低。

我们还可以使用这种方法作为更复杂研究的起点,并且可以使用编码器-解码器来改进这些结果。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像处理
    +关注

    关注

    27

    文章

    1275

    浏览量

    56557
  • AI
    AI
    +关注

    关注

    87

    文章

    29740

    浏览量

    268038
  • 代码
    +关注

    关注

    30

    文章

    4719

    浏览量

    68210
  • python
    +关注

    关注

    55

    文章

    4766

    浏览量

    84362

原文标题:使用Python进行图像处理

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    常用的Python图像处理库介绍

    本文主要介绍了一些简单易懂最常用的 Python 图像处理库。
    的头像 发表于 08-19 10:54 1958次阅读

    Python图像处理图像腐蚀与图像膨胀

    膨胀处理,其中B是一个卷积模板或卷积核,其形状可以为正方形或圆形,通过模板B与图像A进行卷积计算,扫描图像中的每一个像素点,用模板元素与二值图像
    发表于 11-23 16:39

    使用opencv进行图像处理

    使用opencv进行图像处理_于仕琪,感兴趣的可以看看。
    发表于 05-03 14:45 0次下载

    python图像处理opencv步骤是怎么样的

    越来越觉得python是一强大的工具,处理样本确实不错。最近因项目需要涉及到图片处理,所以开始用python调用opencv,再次觉得python
    发表于 12-04 15:29 4393次阅读

    Python基础-图像处理工具包

    增强,直方图处理,插值和滤波等 等。虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开发能力以及面向对象等等诸多特点使得它非常适 合用来
    发表于 03-30 14:09 17次下载

    Python图像处理库Pillow入门教程和代码资料免费下载

    Pillow 是Python 里的图像处理库(PIL:Python Image Library),提供了了广泛的文件格式支持,强大的图像
    发表于 01-11 16:20 30次下载
    <b class='flag-5'>Python</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>库Pillow入门教程和代码资料免费下载

    Python教程之如何使用使用PIL库做图像处理的资料说明

    图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是
    发表于 01-18 17:01 15次下载
    <b class='flag-5'>Python</b>教程之如何使用使用PIL库做<b class='flag-5'>图像</b><b class='flag-5'>处理</b>的资料说明

    Python中最常用十大图像处理库详细介绍

    本文主要介绍了一些简单易懂最常用的Python图像处理库当今世界充满了各种数据,而图像是其中高的重要组成部分。然而,若想其有所应用,我们需要对这些
    的头像 发表于 07-06 11:08 2.2w次阅读

    如何使用Python和Numpy等技术实现图像处理

    本文档的主要内容详细介绍的是如何使用Python、Numpy、Scipy和matplotlib执行图像处理任务。
    发表于 08-28 09:36 8次下载
    如何使用<b class='flag-5'>Python</b>和Numpy等技术实现<b class='flag-5'>图像</b><b class='flag-5'>处理</b>

    如何使用Python和OpenCV进行图像拼接

      图像拼接是计算机视觉中最成功的应用之一。如今,很难找到不包含此功能的手机或图像处理API。在本文中,我们将讨论如何使用Python和OpenCV
    的头像 发表于 10-26 15:59 1903次阅读

    分享5个用于图像处理Python

    图像处理是操纵图像以从中提取特征的现象。 在当今计算机视觉和深度学习的世界中,大量使用不同的图像处理算法对
    的头像 发表于 02-08 16:23 1296次阅读
    分享5个用于<b class='flag-5'>图像</b><b class='flag-5'>处理</b>的<b class='flag-5'>Python</b>库

    十个简单易懂最常用的 Python 图像处理

    本文主要介绍了一些简单易懂最常用的 Python 图像处理库。 当今世界充满了各种数据,而图像是其中高的重要组成部分。然而,若想其有所应用,我们需要对这些
    的头像 发表于 02-08 16:59 783次阅读

    关于python中非常实用的一个图像处理库 1

    PIL:Python Imaging Library,是Python环境下最受欢迎的图像处理库,木有之一。然而,在Python2.7之后不再
    的头像 发表于 02-08 17:18 1290次阅读

    关于python中非常实用的一个图像处理库 2

    PIL:Python Imaging Library,是Python环境下最受欢迎的图像处理库,木有之一。然而,在Python2.7之后不再
    的头像 发表于 02-08 17:18 1058次阅读

    如何使用Python进行图像识别的自动学习自动训练?

    如何使用Python进行图像识别的自动学习自动训练? 使用Python进行图像识别的自动学习和自
    的头像 发表于 01-12 16:06 515次阅读