我目前正在尝试使用 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
在我上面提供的示例中,它计算下面的汉字“爱”的面积和周长(红色图像据说是每个度量值的来源,以像素为单位):
但是,这样做的重点是计算“周长复杂度”,即图像周长的平方除以 4 乘以面积乘以 pi(在我的代码中计算)。当我在 R 中运行它时,它给出的值非常低。相比之下,我见过的另一个使用 Mathematica 执行此操作的数据库给出的该角色的周边复杂度值约为 35,而对于不同的图像大小,我总是得到 1.5 左右或更低。是什么造成了这种差异?有没有办法更改代码以更准确地反映分数?
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
- 有点不同,但这只是因为分辨率相对于字符大小的变化。