周边复杂度测量中的像素数在 R 中不起作用

问题描述 投票:0回答:1

我目前正在尝试使用 R 中的

EBImage
包(参见此处的文章)来获取二值图像的周长和面积。具体来说,我正在尝试对英文和中文字符执行此操作。下面是我编写的一些代码,试图实现这一目标。它本质上是在 R 中生成一个字符,将该字符保存为目录中具有白色背景的 .jpeg 文件,然后导入该文件。之后它创建图像的二进制版本并计算周长和面积,稍后我将其用于其他计算。

#### Load Library ####
library(EBImage)

#### Create Text Image Function ####
textPlot <- function(plotname, string,cex=20){
  par(mar=c(0,0,0,0))
  jpeg(paste0(plotname, ".jpg"))
  plot(c(0, 1), c(0, 1), ann = F, bty = 'n', type = 'n', xaxt = 'n', yaxt = 'n')
  text(x = 0.5, y = 0.5, paste(string), cex = cex, col = "black", family="serif", font=2, adj=0.5)
  dev.off()
}

#### Generate Images for W and 爱 ####
textPlot("w","w",20)
textPlot("ai","爱",20)

#### Pre-Process Image ####
path <- "C:/Users/User/Desktop/main_projects/ai.jpg" # set wd
img <- readImage(path) # original image
gray_img <- channel(img, "gray") # converts to grayscale
binary_img <- gray_img > 0.5 # creates threshold for binary
labeled_img <- bwlabel(binary_img) # labels binary objects

#### Compare Images ####
plot(img)
plot(gray_img)
plot(binary_img)

#### Compute Shape Features (Perimeter/Area) ####
shape_features <- computeFeatures.shape(labeled_img)
perimeters <- shape_features[, "s.perimeter"]
areas <- shape_features[, "s.area"]

#### Display Original Image w/ Labeled Boundaries ####
display(img, method = "raster")
highlight <- paintObjects(labeled_img, img, col = "red")
display(highlight, method = "raster")

#### Print Perimeter and Area ####
perimeters
areas
pc <- (sum(perimeters)^2) / (4*sum(areas)*pi)
pc # both chars only slight diff., always changes when inc. size

在我上面提供的示例中,它计算下面的汉字“爱”的面积和周长(红色图像据说是每个度量值的来源,以像素为单位):

enter image description here

但是,这样做的重点是计算“周长复杂度”,即图像周长的平方除以 4 乘以面积乘以 pi(在我的代码中计算)。当我在 R 中运行它时,它给出的值非常低。相比之下,我见过的另一个使用 Mathematica 执行此操作的数据库给出的该角色的周边复杂度值约为 35,而对于不同的图像大小,我总是得到 1.5 左右或更低。是什么造成了这种差异?有没有办法更改代码以更准确地反映分数?

r image image-processing wolfram-mathematica ebimage
1个回答
0
投票
computeFeatures.shape

需要1(白色)作为前景,0(黑色)作为背景。因此,您正在计算角色周围负空间的复杂性。当我们刚刚改变时

binary_img <- gray_img > 0.5 # creates threshold for binary

binary_img <- gray_img < 0.5 # creates threshold for binary

我得到 
26.8358

的复杂性 - 与 35 有所不同,但这可能是字体的差异。

这也解释了为什么当您更改大小时它会发生变化,假设您所说的大小是指 

cex

参数 - 当您增加文本大小时,图像的外周保持相同的大小,因此您发生了质的变化负空间的形状。将

cex
更改为 10 后,我得到
26.29365
- 有点不同,但这只是因为分辨率相对于字符大小的变化。
    

© www.soinside.com 2019 - 2024. All rights reserved.