R語言實現圖像查重

使用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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章