使用R語言編寫三個腳本實現圖像查重(需要提前導入R的jpeg庫)
R腳本路徑:
D:\Computer Science\Programming\R\ImageProcessing
圖像存儲路徑(圖像名稱任意):
D:\Computer Science\Programming\R\ImageProcessing\data
程序不難,沒寫註釋,簡單說下思路:
確定一個平面,平面只有兩個參數:width和height,並且不大於所有圖像中最小邊界(可以理解爲,平面也是一張圖像,它的width是所有圖像中最小的,height也是最小的,所以就可以確定地說:以所有圖像的左頂點爲錨點,該平面一定可以完整覆蓋到所有圖像上,覆蓋的地方稱爲投影),這種方案下,所有圖像中不宜有尺寸過小的。然後根據圖像數量在平面投影上隨機確定一部分點,總的趨勢是圖像越多,投影上的點就越密集,並且不同圖像上所有點的位置都是相同的,之後對所有圖像中的點進行RGB計算。計算流程:對一張圖像上的點,單個進行RGB計算(點的RGB計算看程序吧,很簡單),然後對所有點進行歸併,最終比對不同圖像上歸併出來的那個值就可以判斷圖像是否相同,可以在data下加入幾張尺寸不同的純白和純黑圖像,觀察輸出的結果。關於程序的改進:可以在最終RGB歸併值的比對結果出來後,再加入對圖像尺寸是否相同的判斷。
1_ImagePoint.r(該腳本實現在所有圖像中找點的動作)
setwd("D:/Computer Science/Programming/R/ImageProcessing/data")
print("working directory has been switched to: D:/Computer Science/Programming/R/ImageProcessing/data")
v <- list.files(getwd())
print("____________")
print("pic name:")
print(v)
print("____________")
num = length(v)
print("pic count:")
print(num)
print("____________")
library(jpeg)
orgpic=readJPEG(v[1])
v4res <- dim(orgpic)
a = v4res[1]
b = v4res[2]
for(i in 1:num) {
orgpic=readJPEG(v[i])
v4res <- dim(orgpic)
if(a>v4res[1]){
a=v4res[1]
}
if(b>v4res[2]){
b=v4res[2]
}
}
res4a <- sample(1:a, size = num)
res4b <- sample(1:b, size = num)
rownames = c("point")
colnames = c("X", "Y")
for(i in 1:num) {
M <- matrix(c(res4a[i],res4b[i]), ncol = 2,byrow = TRUE, dimnames = list(rownames, colnames))
print(M)
}
print("____________")
paintfun <- function(aa,bb){
plot(x = res4a,y = res4b,
xlab = "Image_X",
ylab = "Image_Y",
xlim = c(1,aa),
ylim = c(1,bb),
main = "Discrete Point"
)
}
2_ImageCalculation.r(該腳本實現點的RGB計算動作)
rgbsum <- c(0,0)
resget <- c(0,0)
for(i in 1:num) {
print(i)
a = 0
orgpic=readJPEG(v[i])
for(j in 1:num) {
v4rgb <- orgpic[res4a[j],res4b[j],]
print(v4rgb)
rgbsum[j] = (v4rgb[1]+v4rgb[2]+v4rgb[3])/3
print (rgbsum[j])
print("__")
a = a+rgbsum[j]
}
print(a)
resget[i]=a
print("____________")
}
picfun <- function(x){
for(i in 1:x) {
print(resget[i])
}
}
picfun(num)
print("____________")
3_ImageMerging.r(該腳本實現點的歸併及相同圖像的文件名輸出)
c <- table(unlist(resget))
print(c)
c<-1:num
mergfun <- function(){
for(i in c){
if(!i%in%c)
{
next
}
#當前點的RGB的平均數,在RGB向量裏面相同元素的下標
cnew <- which(resget==resget[i])
c<-c[!c%in%cnew]
print(v[cnew])
}
}
mergfun()