当前位置: 首页 > news >正文

免费个人logo设计网站网站域名解析ip查询

免费个人logo设计网站,网站域名解析ip查询,图文广告设计公司,福州做网站公司文章目录一、 平移1、思路2、实现代码二、缩放1、思路2、代码实现三、旋转变换1、思路对文章内容如有异议欢迎在评论区提问代码包: 数字图像平移、旋转、缩放一、 平移 1、思路 新建一个图像,他的大小比原来的图像要大一些,因为平移后图像位…

文章目录

  • 一、 平移
    • 1、思路
    • 2、实现代码
  • 二、缩放
    • 1、思路
  • 2、代码实现
  • 三、旋转变换
    • 1、思路

对文章内容如有异议欢迎在评论区提问
代码包: 数字图像平移、旋转、缩放

一、 平移

1、思路

新建一个图像,他的大小比原来的图像要大一些,因为平移后图像位置发生变化,图像被移动后,会有一部分位置空出来。平移前和平移后的效果图如图所示:
【原图】
在这里插入图片描述
【平移后的图像】

在这里插入图片描述

原图和平移后的图像相比,很明显,红色框框住的那部分是平移后空出来的部分。
所以平移思路就是,将原先图像的横坐标和纵坐标分别加上一个数字,变成一个新的坐标,然后将原图中原坐标位置的RGB赋值给新图中新坐标。

2、实现代码

		//读原图Mat image;image = imread("pic.jpg", CV_LOAD_IMAGE_COLOR);if (!image.data){cout << "找不到图片或无法打开图片\n";return -1;}namedWindow("image_source", CV_WINDOW_AUTOSIZE);imshow("原图", image);//--------------------平移变换--------------int dx = 10, dy = 20;Mat image_shift(image.rows + dx, image.cols+dy, CV_8UC3);//新建一个大于原图的图像,备用//一个个像素进行处理for (int counter1 = 0; counter1 < image.rows; counter1++){for (int counter2 = 0; counter2 < image.cols; counter2++){//将原坐标进行平移,并将原坐标上的RGB值赋给新坐标image_shift.at<Vec3b>(counter1+dx, counter2+dy)[0] = image.at<Vec3b>(counter1, counter2)[0];image_shift.at<Vec3b>(counter1+dx, counter2 + dy)[1] = image.at<Vec3b>(counter1, counter2)[1];image_shift.at<Vec3b>(counter1+dx , counter2+ dy)[2] = image.at<Vec3b>(counter1, counter2)[2];}}//imshow("平移", image_shift);imwrite("1.jpg", image_shift);//将平移后的图像存储为名称为1.jpg的文件//-------------- 平移完成-------------------

二、缩放

1、思路

  • 先拿放大来说吧。把放大想象成这样一个过程,你画了一幅画,然后你拿了一个和这个画一样大的筛子(应该都有了解吧),放在画上,这样筛子的每个孔是不是对应画的非常小的一点区域。然后你就把筛子孔对应那个区域的RGB值赋给哪个筛子孔,然后你在把每一个筛子孔放大,就得到了放大后的图像。
  • 就数字图像来说的话,比如你把图像要放大2倍,也就是说,新图像的像素数是原图像的2倍,但是你又必须把每个新图像的像素对应到某个原图像的像素上去,所以你就得将新图像的坐标乘以1/2,然后四射五入,得到原图像对应得像素,在RGB值对应起来。
  • 上面其实和筛子原理是一样的,只不过计算机中不可能放大一个像素的大小,所以乘以1/2相当于是把筛子缩小,正好对应上画的大小。
  • 效果图如下:是缩小效果图
    在这里插入图片描述

2、代码实现

//----------------尺度变换------------------double mul_num = 0.8;//大于1是放大,小于1是缩小int row_num = (int)floor(image.rows * mul_num), col_num = (int)floor(image.cols * mul_num);Mat image_scale(row_num, col_num, CV_8UC3);for (int counter1 = 0; counter1 < row_num; counter1++){for (int counter2 = 0; counter2 < col_num; counter2++){//将筛孔缩小,对上画的大小int x = (int)1.0 / mul_num *counter1, y = (int)1.0 / mul_num *counter2;image_scale.at<Vec3b>(counter1, counter2 )[0] = image.at<Vec3b>(x, y)[0];image_scale.at<Vec3b>(counter1, counter2 )[1] = image.at<Vec3b>(x, y)[1];image_scale.at<Vec3b>(counter1, counter2 )[2] = image.at<Vec3b>(x, y)[2];}}//imshow("尺度变换", image_scale);imwrite("2.jpg", image_scale);//存储变换后的图像//----------------尺度变换完成---------------

三、旋转变换

1、思路

  • 如果直接按照仿射矩阵来旋转的话会出问题。因为那个是围绕左上角的原点来旋转的,你一旋转以后,他马上会越界访问,所以会出现问题。下面详细来说:
    在这里插入图片描述
  • 如上图所示,将原图像按上述方式旋转以后,会超出原图像的区域。当然我们也有补救的办法,那就是创建一个相当大的新图像,不管它围绕原点怎么转,都不会出去的方案。但那个比较浪费。所以我用了下面的方法。
  • 将它沿着它的中心旋转,这样就好控制新图像所在的范围了。
    在这里插入图片描述
    这样就比较好了。
  • 围绕中心旋转也比较好处理,我们还是回到前面的那个旋转结果啊。
    在这里插入图片描述
    把这两个图像放在一个坐标系中,可以看到,想要得到围绕中心旋转的图像,可以把上述旋转得到的图像的中心移动到原的图像的中心即可。也就是说观察新图像和原图像两者的中心得坐标发生了什么变化。
  • 通过观察发现,新图像的中心横纵坐标分别减去,两中心间横纵坐标间的距离,就可以得到原图像中心坐标。如果对新图像的每个坐标都做上面的变化,那么就将它平移到了原图像中心的位置。
  • 具体实现代码如下:
//----------------旋转变换------------------double angle = 135.0 * 3.1415926 / 180.0;//把角度化成弧度int dis = ceil(sqrt(pow(image.rows, 2) + pow(image.cols, 2)));//新图像的长宽应该是原图像的对角线长度Mat image_nrota(dis, dis, CV_8UC3);for (int counter1 = 0; counter1 < image.rows; counter1++){for (int counter2 = 0; counter2 < image.cols; counter2++){//计算应该平移的距离float cenX = image_nrota.rows/2 - ((image.rows / 2) * cos(angle) - (image.cols/2) * sin(angle)), cenY = image_nrota.cols/2 - ((image.rows / 2) * sin(angle) + (image.cols / 2) * cos(angle));//按照仿射矩阵计算后进行平移int x = counter1 * cos(angle) - counter2 * sin(angle) + cenX, y = counter1 * sin(angle) + counter2 * cos(angle) + cenY;image_nrota.at<Vec3b>(x, y)[0] = image.at<Vec3b>(counter1, counter2)[0];image_nrota.at<Vec3b>(x, y)[1] = image.at<Vec3b>(counter1, counter2)[1];image_nrota.at<Vec3b>(x, y)[2] = image.at<Vec3b>(counter1, counter2)[2];}}//imshow("旋转", image_nrota);imwrite("3.jpg", image_nrota);//-----------旋转变换完成---------------
  • 后面还有偏移变换,就不在赘述原理了,比较简单,直接上完整代码。

【change.h】

#pragma once
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cmath>
#include <Windows.h>using namespace std;
using namespace cv;//对图像进行平移操作
void shift(Mat &image, int dx, int dy)
{Mat image_shift(image.rows + dx, image.cols + dy, CV_8UC3);//新建一个大于原图的图像,备用//一个个像素进行处理for (int counter1 = 0; counter1 < image.rows; counter1++){for (int counter2 = 0; counter2 < image.cols; counter2++){//将原坐标进行平移,并将原坐标上的RGB值赋给新坐标image_shift.at<Vec3b>(counter1 + dx, counter2 + dy)[0] = image.at<Vec3b>(counter1, counter2)[0];image_shift.at<Vec3b>(counter1 + dx, counter2 + dy)[1] = image.at<Vec3b>(counter1, counter2)[1];image_shift.at<Vec3b>(counter1 + dx, counter2 + dy)[2] = image.at<Vec3b>(counter1, counter2)[2];}}//imshow("平移", image_shift);imwrite("1.jpg", image_shift);//将平移后的图像存储为名称为1.jpg的文件
}//进行尺度变换
void scale(Mat &image, double mul_num)
{int row_num = (int)floor(image.rows * mul_num), col_num = (int)floor(image.cols * mul_num);Mat image_scale(row_num, col_num, CV_8UC3);for (int counter1 = 0; counter1 < row_num; counter1++){for (int counter2 = 0; counter2 < col_num; counter2++){//将筛孔缩小,对上画的大小int x = (int)1.0 / mul_num * counter1, y = (int)1.0 / mul_num * counter2;image_scale.at<Vec3b>(counter1, counter2)[0] = image.at<Vec3b>(x, y)[0];image_scale.at<Vec3b>(counter1, counter2)[1] = image.at<Vec3b>(x, y)[1];image_scale.at<Vec3b>(counter1, counter2)[2] = image.at<Vec3b>(x, y)[2];}}//imshow("尺度变换", image_scale);imwrite("2.jpg", image_scale);//存储变换后的图像
}//进行旋转
void rotation(Mat &image, double angle_in)
{double angle = angle_in * 3.1415926 / 180.0;//把角度化成弧度int dis = ceil(sqrt(pow(image.rows, 2) + pow(image.cols, 2)));//新图像的长宽应该是原图像的对角线长度Mat image_nrota(dis, dis, CV_8UC3);for (int counter1 = 0; counter1 < image.rows; counter1++){for (int counter2 = 0; counter2 < image.cols; counter2++){//计算应该平移的距离float cenX = image_nrota.rows / 2 - ((image.rows / 2) * cos(angle) - (image.cols / 2) * sin(angle)),cenY = image_nrota.cols / 2 - ((image.rows / 2) * sin(angle) + (image.cols / 2) * cos(angle));//按照仿射矩阵计算后进行平移int x = counter1 * cos(angle) - counter2 * sin(angle) + cenX,y = counter1 * sin(angle) + counter2 * cos(angle) + cenY;image_nrota.at<Vec3b>(x, y)[0] = image.at<Vec3b>(counter1, counter2)[0];image_nrota.at<Vec3b>(x, y)[1] = image.at<Vec3b>(counter1, counter2)[1];image_nrota.at<Vec3b>(x, y)[2] = image.at<Vec3b>(counter1, counter2)[2];}}//imshow("旋转", image_nrota);imwrite("3.jpg", image_nrota);
}//垂直偏移变换
void voffset(Mat &image, double sv)
{Mat image_voffset(sv*image.rows + image.cols, image.cols, CV_8UC3);for (int counter1 = 0; counter1 < image.rows; counter1++){for (int counter2 = 0; counter2 < image.cols; counter2++){int x = counter1 * sv + counter2;image_voffset.at<Vec3b>(x, counter2)[0] = image.at<Vec3b>(counter1, counter2)[0];image_voffset.at<Vec3b>(x, counter2)[1] = image.at<Vec3b>(counter1, counter2)[1];image_voffset.at<Vec3b>(x, counter2)[2] = image.at<Vec3b>(counter1, counter2)[2];}}//imshow("垂直偏移", image_voffset);imwrite("4.jpg", image_voffset);
}//水平偏移变换
void hoffset(Mat &image, double sh)
{Mat image_hoffset(image.rows, sh*image.rows + image.cols, CV_8UC3);for (int counter1 = 0; counter1 < image.rows; counter1++){for (int counter2 = 0; counter2 < image.cols; counter2++){int y = counter1 * sh + counter2;image_hoffset.at<Vec3b>(counter1, y)[0] = image.at<Vec3b>(counter1, counter2)[0];image_hoffset.at<Vec3b>(counter1, y)[1] = image.at<Vec3b>(counter1, counter2)[1];image_hoffset.at<Vec3b>(counter1, y)[2] = image.at<Vec3b>(counter1, counter2)[2];}}//imshow("水平偏移", image_hoffset);imwrite("5.jpg", image_hoffset);
}

【main.cpp】

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cmath>
#include <Windows.h>
#include "change.h"using namespace std;
using namespace cv;
int main()
{//读原图Mat image;image = imread("pic.jpg", CV_LOAD_IMAGE_COLOR);if (!image.data){cout << "找不到图片或无法打开图片\n";return -1;}namedWindow("image_source", CV_WINDOW_AUTOSIZE);imshow("原图", image);//平移shift(image, 10, 20);//缩放scale(image, 0.8);//旋转rotation(image, 45);//垂直偏移voffset(image, 1);//水平偏移hoffset(image, 1);//连续播放变换后的图像string picname = "";Mat image2;for (int counter = 1; counter < 6; counter++){picname = '0'+ counter;picname += ".jpg";image2 = imread(picname,CV_LOAD_IMAGE_COLOR);imshow("变换后的图像", image2);	waitKey(3000);}waitKey(0);return 0;
}
http://www.lbrq.cn/news/2349343.html

相关文章:

  • 北京网站建设的服务外链交换平台
  • dedecms手机网站模板安装教程搜外友链
  • 景山网站建设教育培训网站模板
  • 国网法治建设网站一个新品牌怎样营销推广
  • 沈阳网站设计外包老王搜索引擎入口
  • wordpress主题哪里买网站seo基础优化
  • 免费做四年级题的网站宁波优化网页基本流程
  • 农业企业网站建设安徽百度seo公司
  • 手机网站建设讯息百度服务中心人工客服
  • asp.net 4.0网站开发实例教程网络营销的特点举例说明
  • 网站主服务器地址网络客服
  • 科技有限公司网站建设策划书百度app官方下载
  • 个人电脑做网站服务器教程网络软文营销是什么意思
  • 网站关键词快速优化广告发布
  • 网站建设需要干什么东莞全网营销推广
  • 上海闵行区邮编郑州纯手工seo
  • 徐州建设网站的公司南昌seo搜索优化
  • 做鱼网站的域名焦作seo推广
  • 常州外贸网站建设百度一下官方入口
  • 网站开发毕业设计报告百度搜索浏览器
  • 网站建设方式与信息化百度seo优化培训
  • 室内装修效果图网站有哪些怎么推广平台
  • 哪些网站建设公司好市场营销培训课程
  • 泸州网站公司新闻危机公关
  • 台湾做电商网站计算机基础培训机构
  • 网站动态添加广告怎么做的关键词查询工具
  • 百度站长平台网站提交全网引流推广
  • 长沙网站 微信建设同城推广
  • 个人怎么注册一个品牌2022年seo还值得做吗
  • 电子商务网站建设体会与收获网页自动点击软件
  • 数据结构--准备知识
  • 【Linux】基本指令详解(二) 输入\输出重定向、一切皆文件、认识管道、man、cp、mv、echo、cat
  • [AI-video] 字幕服务 | 视频素材服务 | 视频生成服务
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘tkinter’问题
  • Node.js Process Events 深入全面讲解
  • React -自定义hooks - 封装双向数据绑定