---
# System prepended metadata

title: Image Processing HW1
tags: [2019imageprocess, hw]

---

# Image Processing HW1
###### tags: `2019imageprocess` `hw`

url https://hackmd.io/qKRGmVSWS5KX4w8zSVwT8w

github https://github.com/linnil1/2019ImageProcessing/tree/master/hw1

## Homeworks
* Process the image array to obtain the histogram of the image.

* hw1-1 imageBasic
  > Read the special .64 image file into a 64x64 image with 32 gray levels and store the data in a 2-dimensional array. 
* hw1-2 Arithmetic Operations of an Image Array
* hw1-2-1 imageAdd
  > Add or subtract a constant value to each pixel in the image.
  > 
  > **Adding is the method to make the image brighter!!**
  > ![](https://i.imgur.com/IQ3YVaU.png)
* hw1-2-2 imageMult
  > Multiply a constant to each pixel in the image.
  > 
  > **Muliply make image brighter but also add contrast**
  > ![](https://i.imgur.com/LOwHYTq.png)
* hw1-2-3 imageAvg
  > Create a new image which is the average image of two input images.
  > 
  > **Maybe it's the way to merge two image**
  > ![](https://i.imgur.com/3lzDECv.png)
* hw1-2-4 imageSpecial
  > Create a new image g(x,y) in which the value of each pixel is determined by calculating the pixel values of the input image f(x,y) using the following equation:
  > `g(x, y) = f(x, y) - f(x - 1, y)`
  > 
  > **This equation is a little bit similar to derivative in x axis, the result show that we can find out where the edge are by this equation** 
  > ![](https://i.imgur.com/BNJkZKQ.png)
## My solutions
I write python code `hw1_np.py` with tool `numpy`. However, using it is a little bit easy, so I write another c++ extentsion for python called `MyImg.h`, `py_myimg.cpp` and `hw1.py`.

To show the result, `QT` or `matplotlib` is used, you can run `qt.py`, `hw1_np.py` respectively.

## Requirement
* Ubuntu18.04 (Debian like is OK)
* Python3.6.8
* Qt5.13.1

You can install with below commands.

`./setup.sh`
``` sh
sudo pip3 install -U numpy matplotlib PyQtChart
sudo apt update
sudo apt install -y python3-pyqt5
```

### Using Docker(Alternative)
Setup your docker step by step with this  [link](https://docs.docker.com/install/linux/docker-ce/ubuntu/).

Build the dockerfile
``` sh
cd hw1
docker build -t linnil1/2019imageprocess .
```

Run it
``` sh
docker run -ti --rm \
    --user $(id -u) \
    -v $PWD:/app \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e DISPLAY=$DISPLAY \
    linnil1/2019imageprocess python3 qt.py
```

## Usage

The working dir is at `hw1`.

### Without QT, with numpy
This program read from commandline and plot by matplotlib.

e.g. To solve hw1-2-1, you can enter 
`python3 hw1_np.py data/LINCOLN.64 --add 200` or `python3 hw1.py data/LINCOLN.64 --add 200`

Use `python3 hw1_np.py --help` to get more information.

Note that even the original image is 32-level gray scale, I remap it to 256 scale, so the maximum of addition is 256.

### Without QT and numpy
Still, plot by matplotlib.

Build it
`python3 setup install`

and run
`python3 hw1.py data/LINCOLN.64`

### With QT(Default)
`python3 qt.py`
or 
`./run.sh`

The promgram should work like this.

![](https://i.imgur.com/KXRBidL.png)

### Windows
`qt.py` is the only built for windows distribution, and the executiable file called `hw1.exe`.

## Algorithm of histogram
I normalize any image to 0~1 and rescale back to 32-levels, then round it to interger. The interger is the index of array and add unit if appear once, two for two times, and so on.

The python code
``` python
arr = np.array([])
arr.resize(32)
map32 = np.uint8(img * 31).flatten()
for i in map32:
    arr[i] += 1
return arr / arr.sum()
```


## 心得
這次作業有兩個難關要走，一個是 c++ extention for python，要讀 python 的 c-api 還要把他 build 成 python module. [My Note](https://hackmd.io/PUAGCBSyQTSU04_pd_qOrQ)

第二個是 UI， UI 用 QT 寫的難度很高(因為 QT 多半是 c++ 的 document)，不像原本 matplotlib(python) 的這麼好用。

第三點是 還要把東西包成 exe 檔，實在不懂，全世界的服務幾乎都跑在 linux 上，造成麻煩而且也有安全性問題GG

這次的 algorithm 很少，就是兩個迴圈硬幹就對了。在此就不贅述。剩下的技術(語法技巧)就寫在註解了。