Learning Opencv 5章作业.docx
- 文档编号:23985521
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:13
- 大小:1.18MB
Learning Opencv 5章作业.docx
《Learning Opencv 5章作业.docx》由会员分享,可在线阅读,更多相关《Learning Opencv 5章作业.docx(13页珍藏版)》请在冰豆网上搜索。
LearningOpencv5章作业
LearningOpencv5章作业
1.
原图(手画,可用PS加一点颜色比较浅的纹理)
a.
#include
#include
usingnamespacecv;
usingnamespacestd;
voidonBarChange(int,void*);//bar回调
Matsrc;
intksize=1;
intmain()
{
namedWindow("src");
namedWindow("dst");
src=imread("H:
\\5_1.png");//read
createTrackbar("2*n+1","src",&ksize,5,onBarChange);
imshow("src",src);
waitKey(0);
return0;
}
voidonBarChange(int,void*)
{
Mattemp;
ksize=ksize==0?
1:
ksize;//保证内核大小最小为3
GaussianBlur(src,temp,Size(ksize*2+1,ksize*2+1),0,0,4);
imshow("dst",temp);
}
b.
#include
#include
usingnamespacecv;
usingnamespacestd;
Matsrc,dst_1,dst_2;
intperceptualHash(MatsrcA,MatsrcB);
intmain()
{
namedWindow("src");
namedWindow("dst1");
namedWindow("dst2");
src=imread("H:
\\cat.jpg");//read
Mattemp;
GaussianBlur(src,temp,Size(5,5),0,0,4);
GaussianBlur(temp,dst_1,Size(5,5),0,0,4);
GaussianBlur(src,dst_2,Size(11,11),0,0,4);
printf("twoimagesimilarpoints:
%d.\n",perceptualHash(dst_1,dst_2));
imshow("src",src);
imshow("dst1",dst_1);
imshow("dst2",dst_2);
waitKey(0);
return0;
}
/************************************************************************/
/*感知哈希算法
对每个图片生成一个“指纹”字符串,然后相互比较“指纹”,相同点约大,
图像越相似。
实现步骤:
1.缩小尺寸,将图像缩小到8*8的尺寸,总共64个像素。
这一步的作用是去除图像的细节,摒弃不同尺寸/比例带来的图像差异;
2.简化色彩:
将缩小后的图像,转为64级灰度;
3.计算平均值:
计算所有64个像素的灰度平均值;
4.比较像素的灰度:
将每个像素的灰度,与平均值进行比较,
大于或等于平均值记为1,小于平均值记为0;
5.计算hash值并比较
利用一对数组遍历做比较,判断出两个图片的相似点。
6.在理论上,这等同于”汉明距离”
a.如果不相同的数据位数不超过5,就说明两张图像很相似;
b.如果大于10,就说明这是两张不同的图像。
参考:
*/
/************************************************************************/
intperceptualHash(Matsrc1,Matsrc2)
{
MatreSrcA,reSrcB;
reSrcA.create(Size(8,8),CV_8UC1);
reSrcB.create(Size(8,8),CV_8UC1);
resize(src1,reSrcA,Size(8,8),0,0,INTER_AREA);
resize(src2,reSrcB,Size(8,8),0,0,INTER_AREA);//缩小图片
MatgraySrcA,graySrcB;
cvtColor(reSrcA,graySrcA,CV_RGB2GRAY);//灰度化
cvtColor(reSrcB,graySrcB,CV_RGB2GRAY);
intgrayValueA=0,grayValueB=0;
intarrA[64],arrB[64];
for(inti=0;i<8;i++)
{
uchar*data1=graySrcA.ptr
uchar*data2=graySrcB.ptr
inttmp=i*8;
for(intj=0;j<8;j++)
{
intindex=tmp+j;
arrA[index]=data1[j]/4;
arrB[index]=data2[j]/4;
grayValueA+=arrA[index];
grayValueB+=arrB[index];
}
}
grayValueA/=64;//算平均值
grayValueB/=64;
for(inti=0;i<64;i++)
{
arrA[i]=(arrA[i]>grayValueA)?
1:
0;
arrB[i]=(arrB[i]>grayValueB)?
1:
0;
}
intiDiffNum=0;
for(inti=0;i<64;i++)
{
if(arrA[i]==arrB[i])
iDiffNum++;
}
returniDiffNum;
}
2.
#include
#include
usingnamespacecv;
usingnamespacestd;
Matsrc,dsta,dstb,dstc;
intperceptualHash(Matsrc1,Matsrc2);
intmain()
{
namedWindow("src");
namedWindow("dsta");
namedWindow("dstb");
namedWindow("dstc");
src.create(Size(100,100),CV_8UC1);
src.zeros(Size(100,100),CV_8UC1);
for(inti=40;i<60;i++)
{
uchar*data=src.ptr
for(intj=40;j<60;j++)
{
data[j]=255;
}
}
dsta.create(Size(100,100),CV_8UC1);
dstb.create(Size(100,100),CV_8UC1);
dstc.create(Size(100,100),CV_8UC1);
GaussianBlur(src,dsta,Size(5,5),0,0,4);
GaussianBlur(src,dstb,Size(9,9),0,0,4);
GaussianBlur(dsta,dstc,Size(5,5),0,0,4);
printf("ilarpoints:
%d.\n",perceptualHash(dstb,dstc));
imshow("src",src);
imshow("dsta",dsta);
imshow("dstb",dstb);
imshow("dstc",dstc);
waitKey(0);
return0;
}
intperceptualHash(Matsrc1,Matsrc2)
{
MatgraySrcA,graySrcB;
graySrcA.create(Size(8,8),CV_8UC1);
graySrcB.create(Size(8,8),CV_8UC1);
resize(src1,graySrcA,Size(8,8),0,0,INTER_AREA);
resize(src2,graySrcB,Size(8,8),0,0,INTER_AREA);//缩小图片
intgrayValueA=0,grayValueB=0;
intarrA[64],arrB[64];
for(inti=0;i<8;i++)
{
uchar*data1=graySrcA.ptr
uchar*data2=graySrcB.ptr
inttmp=i*8;
for(intj=0;j<8;j++)
{
intindex=tmp+j;
arrA[index]=data1[j]/4;
arrB[index]=data2[j]/4;
grayValueA+=arrA[index];
grayValueB+=arrB[index];
}
}
grayValueA/=64;//算平均值
grayValueB/=64;
for(inti=0;i<64;i++)
{
arrA[i]=(arrA[i]>grayValueA)?
1:
0;
arrB[i]=(arrB[i]>grayValueB)?
1:
0;
}
intiDiffNum=0;
for(inti=0;i<64;i++)
{
if(arrA[i]==arrB[i])
iDiffNum++;
}
returniDiffNum;
}
3
#include
#include
usingnamespacecv;
usingnamespacestd;
Matsrc1,src2,dsta,dstb,dstc;
intmain()
{
src1=imread("H:
\\cup_1.jpg");
src2=imread("H:
\\cup_2.jpg");
dsta.create(src1.size(),CV_8UC3);
absdiff(src1,src2,dsta);//图像求绝对值
morphologyEx(dsta,dstb,MORPH_OPEN,NULL);
morphologyEx(dsta,dstc,MORPH_CLOSE,NULL);
printf("a.理想条件下图像为黑色的原因是,两张图像的内容基本一致,对于的每个像素点的值相减应该为0,即为黑色。
\n");
namedWindow("dsta");
namedWindow("dstb");
namedWindow("dstc");
imshow("dsta",dsta);
imshow("dstb",dstb);
imshow("dstc",dstc);
waitKey(0);
return0;
}
5
#include
#include
usingnamespacecv;
usingnamespacestd;
Matsrc1,src2;
intmain()
{
src1=imread("H:
\\none.jpg");
src2=imread("H:
\\boom.jpg");
Matsrc1g,src2g,absSrc,src_th,src_mo;
cvtColor(src1,src1g,CV_RGB2GRAY);
cvtColor(src2,src2g,CV_RGB2GRAY);
absdiff(src1g,src2g,absSrc);//灰度化并去绝对值
threshold(absSrc,src_th,100,255,THRESH_BINARY);//二值化阈值操作
morphologyEx(src_th,src_mo,MORPH_OPEN,NULL);//形态学-->开运算
namedWindow("src1",0);
namedWindow("src2",0);
namedWindow("absSrc",0);
namedWindow("th",0);
namedWindow("mo",0);
imshow("src1",src1g);
imshow("src2",src2g);
imshow("absSrc",absSrc);
imshow("th",src_th);
imshow("mo",src_mo);
waitKey(0);
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Learning Opencv 5章作业 作业