-
Notifications
You must be signed in to change notification settings - Fork 17
/
ClassicalImageInpainting.cpp
130 lines (103 loc) · 4.02 KB
/
ClassicalImageInpainting.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*=========================================================================
*
* Copyright David Doria 2012 [email protected]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
// Custom
#include "Utilities/IndirectPriorityQueue.h"
// Submodules
#include <Helpers/Helpers.h>
// Pixel descriptors
#include "PixelDescriptors/ImagePatchPixelDescriptor.h"
// Descriptor visitors
#include "Visitors/DescriptorVisitors/ImagePatchDescriptorVisitor.hpp"
// Inpainting visitors
#include "Visitors/InpaintingVisitors/InpaintingVisitor.hpp"
#include "Visitors/AcceptanceVisitors/DefaultAcceptanceVisitor.hpp"
// Nearest neighbors
#include "NearestNeighbor/LinearSearchBest/Property.hpp"
// Initializers
#include "Initializers/InitializeFromMaskImage.hpp"
#include "Initializers/InitializePriority.hpp"
// Inpainters
#include "Inpainters/CompositePatchInpainter.hpp"
#include "Inpainters/PatchInpainter.hpp"
// Difference functions
#include "DifferenceFunctions/Patch/ImagePatchDifference.hpp"
#include "DifferenceFunctions/Pixel/SumSquaredPixelDifference.hpp"
// Utilities
#include "Utilities/PatchHelpers.h"
// Inpainting
#include "Algorithms/InpaintingAlgorithm.hpp"
#include "Algorithms/InpaintingAlgorithmWithLocalSearch.hpp"
// Priority
#include "Priority/PriorityCriminisi.h"
// ITK
#include "itkImageFileReader.h"
// Boost
#include <boost/graph/grid_graph.hpp>
#include <boost/property_map/property_map.hpp>
#include "Drivers/ClassicalImageInpainting.hpp"
// Run with: Data/trashcan.png Data/trashcan.mask 15 filled.png
int main(int argc, char *argv[])
{
// Verify arguments
if(argc != 5)
{
std::cerr << "Required arguments: image.png imageMask.mask patchHalfWidth output.png" << std::endl;
std::cerr << "Input arguments: ";
for(int i = 1; i < argc; ++i)
{
std::cerr << argv[i] << " ";
}
return EXIT_FAILURE;
}
// Parse arguments
std::string imageFilename = argv[1];
std::string maskFilename = argv[2];
std::stringstream ssPatchHalfWidth;
ssPatchHalfWidth << argv[3];
unsigned int patchHalfWidth = 0;
ssPatchHalfWidth >> patchHalfWidth;
std::string outputFileName = argv[4];
// Output arguments
// std::cout << "Reading image: " << imageFilename << std::endl;
// std::cout << "Reading mask: " << maskFilename << std::endl;
// std::cout << "Patch half width: " << patchHalfWidth << std::endl;
// std::cout << "Output: " << outputFileName << std::endl;
typedef itk::Image<itk::CovariantVector<int, 3>, 2> OriginalImageType;
typedef itk::ImageFileReader<OriginalImageType> ImageReaderType;
ImageReaderType::Pointer imageReader = ImageReaderType::New();
imageReader->SetFileName(imageFilename);
imageReader->Update();
// OriginalImageType* originalImage = imageReader->GetOutput();
OriginalImageType::Pointer originalImage = OriginalImageType::New();
ITKHelpers::DeepCopy(imageReader->GetOutput(), originalImage.GetPointer());
Mask::Pointer mask = Mask::New();
mask->Read(maskFilename);
std::cout << "Done reading mask." << std::endl;
ClassicalImageInpainting(originalImage, mask, patchHalfWidth);
// If the output filename is a png file, then use the RGBImage writer so that it is first
// casted to unsigned char. Otherwise, write the file directly.
if(Helpers::GetFileExtension(outputFileName) == "png")
{
ITKHelpers::WriteRGBImage(originalImage.GetPointer(), outputFileName);
}
else
{
ITKHelpers::WriteImage(originalImage.GetPointer(), outputFileName);
}
return EXIT_SUCCESS;
}