ppm图像模糊过滤器创建8个单独的图像 我有一个新的C++,我有一个任务,我的课程阅读一个P6 ppm图像,并使用一些过滤器上。我坚持在模糊的一个,我不能找到我的逻辑错误在我的代码。 我的问题是,输出图像是模糊的,但它就像有4个模糊的相同的图像那里
编辑-这里是到输出图像(TESTFILTER.ppm)的链接,输入图像(原始)和一个简单的查看器来查看我的教授给我们的图像(cpiewer) 这是模糊过滤器代码ppm图像模糊过滤器创建8个单独的图像 我有一个新的C++,我有一个任务,我的课程阅读一个P6 ppm图像,并使用一些过滤器上。我坚持在模糊的一个,我不能找到我的逻辑错误在我的代码。 我的问题是,输出图像是模糊的,但它就像有4个模糊的相同的图像那里,c++,filter,blur,ppm,C++,Filter,Blur,Ppm,编辑-这里是到输出图像(TESTFILTER.ppm)的链接,输入图像(原始)和一个简单的查看器来查看我的教授给我们的图像(cpiewer) 这是模糊过滤器代码 typedef Vec3<float> buffer; static void blur(Image* pic) { //BLUR FILTER int h = pic->getHeight(); int w = pic->getWidth();
typedef Vec3<float> buffer;
static void blur(Image* pic) { //BLUR FILTER
int h = pic->getHeight();
int w = pic->getWidth();
int count = 0;
buffer* temp = new buffer[h*w];
for (int x = 0; x < w; x++){
for (int y = 0; y < h; y++){
if (x == 0 && y == 0) {
count++;
temp[y*w + x] = (pic->getPixel(x, y) + pic->getPixel(x + 1, y) + pic->getPixel(x, y + 1) + pic->getPixel(x + 1, y + 1)) / 4;
}
else if (x == 0 && y == h - 1) {
count++;
temp[y*w + x] = (pic->getPixel(x, y) + pic->getPixel(x + 1, y) + pic->getPixel(x, y - 1) + pic->getPixel(x + 1, y - 1)) / 4;
}
else if (x == w - 1 && y == 0){
count++;
temp[y*w + x] = (pic->getPixel(x, y) + pic->getPixel(x - 1, y) + pic->getPixel(x, y + 1) + pic->getPixel(x - 1, y + 1)) / 4;
}
else if (x == w - 1 && y == h - 1){
count++;
temp[y*w + x] = (pic->getPixel(x, y) + pic->getPixel(x - 1, y) + pic->getPixel(x, y - 1) + pic->getPixel(x - 1, y - 1)) / 4;
}
else if (x == 0){
count++;
temp[y*w + x] = ((pic->getPixel(x, y)) + (pic->getPixel(x, y - 1)) + (pic->getPixel(x, y + 1)) + (pic->getPixel(x + 1, y - 1)) + (pic->getPixel(x + 1, y)) + (pic->getPixel(x + 1, y + 1))) / 6;
}
else if (x == w - 1){
count++;
temp[y*w + x] = ((pic->getPixel(x, y)) + (pic->getPixel(x, y - 1)) + (pic->getPixel(x, y + 1)) + (pic->getPixel(x - 1, y + 1)) + (pic->getPixel(x - 1, y)) + (pic->getPixel(x - 1, y - 1))) / 6;
}
else if (y == 0){
count++;
temp[y*w + x] = ((pic->getPixel(x, y)) + (pic->getPixel(x, y - 1)) + (pic->getPixel(x, y + 1)) + (pic->getPixel(x - 1, y + 1)) + (pic->getPixel(x - 1, y)) + (pic->getPixel(x + 1, y + 1))) / 6;
}
else if (y == h - 1){
count++;
temp[y*w + x] = ((pic->getPixel(x, y)) + (pic->getPixel(x, y - 1)) + (pic->getPixel(x - 1, y)) + (pic->getPixel(x + 1, y - 1)) + (pic->getPixel(x + 1, y)) + (pic->getPixel(x - 1, y - 1))) / 6;
}
else {
count++;
temp[y*w + x].r = ((pic->getPixel(x, y).r) + (pic->getPixel(x + 1, y).r) + (pic->getPixel(x, y + 1).r) + (pic->getPixel(x, y - 1).r) + (pic->getPixel(x - 1, y).r) + (pic->getPixel(x - 1, y - 1).r) + (pic->getPixel(x + 1, y + 1).r) + (pic->getPixel(x + 1, y - 1).r) + (pic->getPixel(x - 1, y + 1).r)) / 9;
temp[y*w + x].g = ((pic->getPixel(x, y).g) + (pic->getPixel(x + 1, y).g) + (pic->getPixel(x, y + 1).g) + (pic->getPixel(x, y - 1).g) + (pic->getPixel(x - 1, y).g) + (pic->getPixel(x - 1, y - 1).g) + (pic->getPixel(x + 1, y + 1).g) + (pic->getPixel(x + 1, y - 1).g) + (pic->getPixel(x - 1, y + 1).g)) / 9;
temp[y*w + x].b = ((pic->getPixel(x, y).b) + (pic->getPixel(x + 1, y).b) + (pic->getPixel(x, y + 1).b) + (pic->getPixel(x, y - 1).b) + (pic->getPixel(x - 1, y).b) + (pic->getPixel(x - 1, y - 1).b) + (pic->getPixel(x + 1, y + 1).b) + (pic->getPixel(x + 1, y - 1).b) + (pic->getPixel(x - 1, y + 1).b)) / 9;
}
}
}
const buffer* constTemp;
constTemp = temp;
pic->setData(constTemp);
std::cout << "TIMES: " << count << std::endl;
这是我的main()
方法
#include "Image.h"
#include "ppm_format.h"
#include "Filters.h"
#include <iostream>
using namespace imaging;
using namespace std;
using namespace filtering;
int main(int argc, char* argv[]) {
Image* image = ReadPPM(argv[argc - 1]); // Creating Image
float r, g, b;
bool filterFlag = false; //Flag used to check if -f command is given
string check;
Vec3<float> temp;
for (int i = 1; i < argc - 2; i++) {
string check(argv[i]);
if (!check.compare("-f")) { filterFlag = true; } // check.compare("-f") returns 0 if check = -f
if (filterFlag) {
i++;
check = argv[i];
if (!check.compare("gray")) {
filterFlag = false; //filter flag falsified to show that a filter is read
gray(image);
}
else if (!check.compare("color")) {
filterFlag = false;
if (argc-2 <= i + 3) {
cout << "INVALID COLOR FILTER CALL.EXITING...";
system("pause");
exit(0);
}
r = i + 1;
g = i + 2;
b = i + 3;
i += 4;
color(image, r, g, b);
}
else if (!check.compare("blur")) {
filterFlag = false;
blur(image);
}
else if (!check.compare("median")){
filterFlag = false;
medianORdiff(image,"median");
}
else if (!check.compare("diff")){
filterFlag = false;
medianORdiff(image,"diff");
}
else {
cout << "Invalid filter name or no filter name at all.\nFilter names are gray , color r g b , blur , median , diff";
system("pause");
exit(0);
}
*image >> "C://Users/M1TR0S0UL4S/Desktop/TESTFILTER.ppm";
}
}
#包括“Image.h”
#包括“ppm_格式.h”
#包括“Filters.h”
#包括
使用名称空间成像;
使用名称空间std;
使用名称空间过滤;
int main(int argc,char*argv[]){
Image*Image=ReadPPM(argv[argc-1]);//创建映像
浮子r,g,b;
bool filterFlag=false;//用于检查是否给出了-f命令的标志
字符串检查;
Vec3温度;
对于(int i=1;i 如果(argc-2你所说的4幅图像是什么意思?你能显示结果吗?它们是并排显示的,还是总共只有4幅图像?实际上它们是8幅,它们在同一帧中混合在一起,就像只渲染了图片的1/4,然后图片的同一部分又重新开始了。我不知道如何将图片发布到你的ans中wer-有一个按钮用于添加图像。这将更容易。还请写下如何运行此程序,即输入参数是什么(我猜这是一个命令行程序?)。图像的最大大小是1mb。因为这些是ppm图像,它们大约是2.5mb,所以我无法上传。命令是-f blur Image01.ppm。这些是参数,我相信我的主要工作原理很好,因为前两个过滤器我做得很好。编辑我上传了图像以及我的教授在免费上传网站上给我们的一个查看器现在,他们将在那里保持多久?你说的4张图片是什么意思?你能显示结果吗?它们是并排显示的,还是总共只有4张图片?实际上它们是8张,它们在同一帧中混合在一起,就像只有1/4的图片被渲染,在它旁边图片的同一部分再次开始我不知道如何发布图片编辑您的答案-有一个添加图片的按钮。这将更容易。另外,请写下您如何运行此程序,即输入参数是什么(我猜这是一个命令行程序?)。图像的最大大小是1mb。因为这些是ppm图像,它们大约是2.5mb,所以我无法上传。命令是-f blur Image01.ppm。这些是参数,我相信我的主要工作原理很好,因为前两个过滤器我做得很好。编辑我上传了图像以及我的教授在免费上传网站上给我们的一个查看器现在他们会把它放在那里多久
#include "Image.h"
#include "ppm_format.h"
#include "Filters.h"
#include <iostream>
using namespace imaging;
using namespace std;
using namespace filtering;
int main(int argc, char* argv[]) {
Image* image = ReadPPM(argv[argc - 1]); // Creating Image
float r, g, b;
bool filterFlag = false; //Flag used to check if -f command is given
string check;
Vec3<float> temp;
for (int i = 1; i < argc - 2; i++) {
string check(argv[i]);
if (!check.compare("-f")) { filterFlag = true; } // check.compare("-f") returns 0 if check = -f
if (filterFlag) {
i++;
check = argv[i];
if (!check.compare("gray")) {
filterFlag = false; //filter flag falsified to show that a filter is read
gray(image);
}
else if (!check.compare("color")) {
filterFlag = false;
if (argc-2 <= i + 3) {
cout << "INVALID COLOR FILTER CALL.EXITING...";
system("pause");
exit(0);
}
r = i + 1;
g = i + 2;
b = i + 3;
i += 4;
color(image, r, g, b);
}
else if (!check.compare("blur")) {
filterFlag = false;
blur(image);
}
else if (!check.compare("median")){
filterFlag = false;
medianORdiff(image,"median");
}
else if (!check.compare("diff")){
filterFlag = false;
medianORdiff(image,"diff");
}
else {
cout << "Invalid filter name or no filter name at all.\nFilter names are gray , color r g b , blur , median , diff";
system("pause");
exit(0);
}
*image >> "C://Users/M1TR0S0UL4S/Desktop/TESTFILTER.ppm";
}
}