我正在尝试使用卷积进行边缘检测。 我认为在卷积后需要对图像进行归一化。
我正在使用此处指定的卷积矩阵: https://en.wikipedia.org/wiki/Kernel_(image_processing)#Convolution
附上一些r代码,以及源图像和输出图像...
require(jpeg)
myjpg <- readJPEG("mtg.jpg")
grayImg <- myjpg[,,1]+myjpg[,,2]+myjpg[,,3] # reduce to gray
grayImg <- grayImg/max(grayImg) # normalize
dim(grayImg)
convolve <- function(img, f){
newimg <- img
radius <- as.integer(nrow(f)/2)+1
print(radius)
for(i in c(1:nrow(img))){
for(j in c(1:ncol(img))){
f_sub <- f[c(max(1,radius-i+1):min(nrow(f),nrow(img)-i+radius)),c(max(1,radius-j+1):min(ncol(f),ncol(img)-j+radius))]
img_sub <- img[c(max(1,i-radius+1):min(nrow(img),i+radius-1)),c(max(1,j-radius+1):min(ncol(img),j+radius-1))]
wavg <- sum(as.vector(f_sub)*as.vector(img_sub))# / sum(as.vector(f_sub)) # todo, not sure about this division
newimg[i,j] <- wavg
}
}
return(newimg)
}
edgeFilter <- matrix(c(-1,-1,-1,-1,8,-1,-1,-1,-1), ncol = 3)
outimg <- convolve(grayImg,edgeFilter)
outimg <- outimg - min(outimg)
outimg <- outimg/max(outimg)
plot(c(0,1),c(0,1),t='n')
rasterImage(outimg, 0,0,1,1)
处理前的灰度图像:
处理后的灰度图像:
我感到困惑,因为我看到的例子中,卷积后的图像是黑白的。在这里,我的卷积需要归一化,并且它不是纯黑白的。
norm 1
outimg1 <- outimg - min(outimg) outimg1 <- outimg1/max(outimg1) plot(c(0,1),c(0,1),t='n') rasterImage(outimg1, 0,0,1,1)norm 2
outimg2 <- ifelse(outimg < 0, 0, outimg) outimg2 <- ifelse(outimg > 1, 1, outimg2) plot(c(0,1),c(0,1),t='n') rasterImage(outimg2, 0,0,1,1) - JoeBass