Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

格式化 #23

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
255 changes: 156 additions & 99 deletions isp_pipeline.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion model/aaf.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import numpy as np
from scipy.ndimage import correlate


class AAF:
'Anti-aliasing Filter'

Expand All @@ -23,4 +24,3 @@ def execute(self):
[1, 0, 1, 0, 1]])/16)
self.img = aaf_img
return self.img

1 change: 1 addition & 0 deletions model/awb.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
import numpy as np


class WBGC:
'Auto White Balance Gain Control'

Expand Down
1 change: 1 addition & 0 deletions model/bcc.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
import numpy as np


class BCC:
'Brightness Contrast Control'

Expand Down
4 changes: 2 additions & 2 deletions model/blc.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
import numpy as np


class BLC:
'Black Level Compensation'

Expand All @@ -23,7 +24,7 @@ def execute(self):
beta = self.parameter[5]
raw_h = self.img.shape[0]
raw_w = self.img.shape[1]
blc_img = np.empty((raw_h,raw_w), np.int16)
blc_img = np.empty((raw_h, raw_w), np.int16)
if self.bayer_pattern == 'rggb':
r = self.img[::2, ::2] + bl_r
b = self.img[1::2, 1::2] + bl_b
Expand Down Expand Up @@ -62,4 +63,3 @@ def execute(self):
blc_img[1::2, 1::2] = gb
self.img = blc_img
return self.clipping()

26 changes: 14 additions & 12 deletions model/bnf.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
import numpy as np


class BNF:
'Bilateral Noise Filtering'

Expand All @@ -25,22 +26,23 @@ def execute(self):
raw_h = self.img.shape[0]
raw_w = self.img.shape[1]
bnf_img = np.empty((raw_h, raw_w), np.uint16)
rdiff = np.zeros((5,5), dtype='uint16')
rdiff = np.zeros((5, 5), dtype='uint16')
for y in range(img_pad.shape[0] - 4):
for x in range(img_pad.shape[1] - 4):
for i in range(5):
for j in range(5):
rdiff[i,j] = abs(img_pad[y+i,x+j] - img_pad[y+2, x+2])
if rdiff[i,j] >= self.rthres[0]:
rdiff[i,j] = self.rw[0]
elif rdiff[i,j] < self.rthres[0] and rdiff[i,j] >= self.rthres[1]:
rdiff[i,j] = self.rw[1]
elif rdiff[i,j] < self.rthres[1] and rdiff[i,j] >= self.rthres[2]:
rdiff[i,j] = self.rw[2]
elif rdiff[i,j] < self.rthres[2]:
rdiff[i,j] = self.rw[3]
rdiff[i, j] = abs(
img_pad[y+i, x+j] - img_pad[y+2, x+2])
if rdiff[i, j] >= self.rthres[0]:
rdiff[i, j] = self.rw[0]
elif rdiff[i, j] < self.rthres[0] and rdiff[i, j] >= self.rthres[1]:
rdiff[i, j] = self.rw[1]
elif rdiff[i, j] < self.rthres[1] and rdiff[i, j] >= self.rthres[2]:
rdiff[i, j] = self.rw[2]
elif rdiff[i, j] < self.rthres[2]:
rdiff[i, j] = self.rw[3]
weights = np.multiply(rdiff, self.dw)
bnf_img[y,x] = np.sum(np.multiply(img_pad[y:y+5,x:x+5], weights[:,:])) / np.sum(weights)
bnf_img[y, x] = np.sum(np.multiply(
img_pad[y:y+5, x:x+5], weights[:, :])) / np.sum(weights)
self.img = bnf_img
return self.clipping()

11 changes: 6 additions & 5 deletions model/ccm.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
import numpy as np


class CCM:
'Color Correction Matrix'

Expand All @@ -15,10 +16,10 @@ def execute(self):
ccm_img = np.empty((img_h, img_w, img_c), np.uint32)
for y in range(img_h):
for x in range(img_w):
mulval = self.ccm[:,0:3] * self.img[y,x,:]
ccm_img[y,x,0] = np.sum(mulval[0]) + self.ccm[0,3]
ccm_img[y,x,1] = np.sum(mulval[1]) + self.ccm[1,3]
ccm_img[y,x,2] = np.sum(mulval[2]) + self.ccm[2,3]
ccm_img[y,x,:] = ccm_img[y,x,:] / 1024
mulval = self.ccm[:, 0:3] * self.img[y, x, :]
ccm_img[y, x, 0] = np.sum(mulval[0]) + self.ccm[0, 3]
ccm_img[y, x, 1] = np.sum(mulval[1]) + self.ccm[1, 3]
ccm_img[y, x, 2] = np.sum(mulval[2]) + self.ccm[2, 3]
ccm_img[y, x, :] = ccm_img[y, x, :] / 1024
self.img = ccm_img.astype(np.uint8)
return self.img
121 changes: 72 additions & 49 deletions model/cfa.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
import numpy as np


class CFA:
'Color Filter Array Interpolation'

Expand All @@ -21,33 +22,39 @@ def clipping(self):
def malvar(self, is_color, center, y, x, img):
if is_color == 'r':
r = center
g = 4 * img[y,x] - img[y-2,x] - img[y,x-2] - img[y+2,x] - img[y,x+2] \
+ 2 * (img[y+1,x] + img[y,x+1] + img[y-1,x] + img[y,x-1])
b = 6 * img[y,x] - 3 * (img[y-2,x] + img[y,x-2] + img[y+2,x] + img[y,x+2]) / 2 \
+ 2 * (img[y-1,x-1] + img[y-1,x+1] + img[y+1,x-1] + img[y+1,x+1])
g = 4 * img[y, x] - img[y-2, x] - img[y, x-2] - img[y+2, x] - img[y, x+2] \
+ 2 * (img[y+1, x] + img[y, x+1] + img[y-1, x] + img[y, x-1])
b = 6 * img[y, x] - 3 * (img[y-2, x] + img[y, x-2] + img[y+2, x] + img[y, x+2]) / 2 \
+ 2 * (img[y-1, x-1] + img[y-1, x+1] +
img[y+1, x-1] + img[y+1, x+1])
g = g / 8
b = b / 8
elif is_color == 'gr':
r = 5 * img[y,x] - img[y,x-2] - img[y-1,x-1] - img[y+1,x-1] - img[y-1,x+1] - img[y+1,x+1] - img[y,x+2] \
+ (img[y-2,x] + img[y+2,x]) / 2 + 4 * (img[y,x-1] + img[y,x+1])
r = 5 * img[y, x] - img[y, x-2] - img[y-1, x-1] - img[y+1, x-1] - img[y-1, x+1] - img[y+1, x+1] - img[y, x+2] \
+ (img[y-2, x] + img[y+2, x]) / 2 + \
4 * (img[y, x-1] + img[y, x+1])
g = center
b = 5 * img[y,x] - img[y-2,x] - img[y-1,x-1] - img[y-1,x+1] - img[y+2,x] - img[y+1,x-1] - img[y+1,x+1] \
+ (img[y,x-2] + img[y,x+2]) / 2 + 4 * (img[y-1,x] + img[y+1,x])
b = 5 * img[y, x] - img[y-2, x] - img[y-1, x-1] - img[y-1, x+1] - img[y+2, x] - img[y+1, x-1] - img[y+1, x+1] \
+ (img[y, x-2] + img[y, x+2]) / 2 + \
4 * (img[y-1, x] + img[y+1, x])
r = r / 8
b = b / 8
elif is_color == 'gb':
r = 5 * img[y,x] - img[y-2,x] - img[y-1,x-1] - img[y-1,x+1] - img[y+2,x] - img[y+1,x-1] - img[y+1,x+1] \
+ (img[y,x-2] + img[y,x+2]) / 2 + 4 * (img[y-1,x] + img[y+1,x])
r = 5 * img[y, x] - img[y-2, x] - img[y-1, x-1] - img[y-1, x+1] - img[y+2, x] - img[y+1, x-1] - img[y+1, x+1] \
+ (img[y, x-2] + img[y, x+2]) / 2 + \
4 * (img[y-1, x] + img[y+1, x])
g = center
b = 5 * img[y,x] - img[y,x-2] - img[y-1,x-1] - img[y+1,x-1] - img[y-1,x+1] - img[y+1,x+1] - img[y,x+2] \
+ (img[y-2,x] + img[y+2,x]) / 2 + 4 * (img[y,x-1] + img[y,x+1])
b = 5 * img[y, x] - img[y, x-2] - img[y-1, x-1] - img[y+1, x-1] - img[y-1, x+1] - img[y+1, x+1] - img[y, x+2] \
+ (img[y-2, x] + img[y+2, x]) / 2 + \
4 * (img[y, x-1] + img[y, x+1])
r = r / 8
b = b / 8
elif is_color == 'b':
r = 6 * img[y,x] - 3 * (img[y-2,x] + img[y,x-2] + img[y+2,x] + img[y,x+2]) / 2 \
+ 2 * (img[y-1,x-1] + img[y-1,x+1] + img[y+1,x-1] + img[y+1,x+1])
g = 4 * img[y,x] - img[y-2,x] - img[y,x-2] - img[y+2,x] - img[y,x+2] \
+ 2 * (img[y+1,x] + img[y,x+1] + img[y-1,x] + img[y,x-1])
r = 6 * img[y, x] - 3 * (img[y-2, x] + img[y, x-2] + img[y+2, x] + img[y, x+2]) / 2 \
+ 2 * (img[y-1, x-1] + img[y-1, x+1] +
img[y+1, x-1] + img[y+1, x+1])
g = 4 * img[y, x] - img[y-2, x] - img[y, x-2] - img[y+2, x] - img[y, x+2] \
+ 2 * (img[y+1, x] + img[y, x+1] + img[y-1, x] + img[y, x-1])
b = center
r = r / 8
g = g / 8
Expand All @@ -62,44 +69,60 @@ def execute(self):
for y in range(0, img_pad.shape[0]-4-1, 2):
for x in range(0, img_pad.shape[1]-4-1, 2):
if self.bayer_pattern == 'rggb':
r = img_pad[y+2,x+2]
gr = img_pad[y+2,x+3]
gb = img_pad[y+3,x+2]
b = img_pad[y+3,x+3]
r = img_pad[y+2, x+2]
gr = img_pad[y+2, x+3]
gb = img_pad[y+3, x+2]
b = img_pad[y+3, x+3]
if self.mode == 'malvar':
cfa_img[y,x,:] = self.malvar('r', r, y+2,x+2, img_pad)
cfa_img[y,x+1,:] = self.malvar('gr', gr, y+2,x+3, img_pad)
cfa_img[y+1,x,:] = self.malvar('gb', gb, y+3,x+2, img_pad)
cfa_img[y+1,x+1,:] = self.malvar('b', b, y+3,x+3, img_pad)
cfa_img[y, x, :] = self.malvar(
'r', r, y+2, x+2, img_pad)
cfa_img[y, x+1,
:] = self.malvar('gr', gr, y+2, x+3, img_pad)
cfa_img[y+1, x,
:] = self.malvar('gb', gb, y+3, x+2, img_pad)
cfa_img[y+1, x+1,
:] = self.malvar('b', b, y+3, x+3, img_pad)
elif self.bayer_pattern == 'bggr':
b = img_pad[y+2,x+2]
gb = img_pad[y+2,x+3]
gr = img_pad[y+3,x+2]
r = img_pad[y+3,x+3]
b = img_pad[y+2, x+2]
gb = img_pad[y+2, x+3]
gr = img_pad[y+3, x+2]
r = img_pad[y+3, x+3]
if self.mode == 'malvar':
cfa_img[y,x,:] = self.malvar('b', b, y+2,x+2, img_pad)
cfa_img[y,x+1,:] = self.malvar('gb', gb, y+2,x+3, img_pad)
cfa_img[y+1,x,:] = self.malvar('gr', gr, y+3,x+2, img_pad)
cfa_img[y+1,x+1,:] = self.malvar('r', r, y+3,x+3, img_pad)
cfa_img[y, x, :] = self.malvar(
'b', b, y+2, x+2, img_pad)
cfa_img[y, x+1,
:] = self.malvar('gb', gb, y+2, x+3, img_pad)
cfa_img[y+1, x,
:] = self.malvar('gr', gr, y+3, x+2, img_pad)
cfa_img[y+1, x+1,
:] = self.malvar('r', r, y+3, x+3, img_pad)
elif self.bayer_pattern == 'gbrg':
gb = img_pad[y+2,x+2]
b = img_pad[y+2,x+3]
r = img_pad[y+3,x+2]
gr = img_pad[y+3,x+3]
gb = img_pad[y+2, x+2]
b = img_pad[y+2, x+3]
r = img_pad[y+3, x+2]
gr = img_pad[y+3, x+3]
if self.mode == 'malvar':
cfa_img[y,x,:] = self.malvar('gb', gb, y+2,x+2, img_pad)
cfa_img[y,x+1,:] = self.malvar('b', b, y+2,x+3, img_pad)
cfa_img[y+1,x,:] = self.malvar('r', r, y+3,x+2, img_pad)
cfa_img[y+1,x+1,:] = self.malvar('gr', gr, y+3,x+3, img_pad)
cfa_img[y, x, :] = self.malvar(
'gb', gb, y+2, x+2, img_pad)
cfa_img[y, x+1,
:] = self.malvar('b', b, y+2, x+3, img_pad)
cfa_img[y+1, x,
:] = self.malvar('r', r, y+3, x+2, img_pad)
cfa_img[y+1, x+1,
:] = self.malvar('gr', gr, y+3, x+3, img_pad)
elif self.bayer_pattern == 'grbg':
gr = img_pad[y+2,x+2]
r = img_pad[y+2,x+3]
b = img_pad[y+3,x+2]
gb = img_pad[y+3,x+3]
gr = img_pad[y+2, x+2]
r = img_pad[y+2, x+3]
b = img_pad[y+3, x+2]
gb = img_pad[y+3, x+3]
if self.mode == 'malvar':
cfa_img[y,x,:] = self.malvar('gr', gr, y+2,x+2, img_pad)
cfa_img[y,x+1,:] = self.malvar('r', r, y+2,x+3, img_pad)
cfa_img[y+1,x,:] = self.malvar('b', b, y+3,x+2, img_pad)
cfa_img[y+1,x+1,:] = self.malvar('gb', gb, y+3,x+3, img_pad)
cfa_img[y, x, :] = self.malvar(
'gr', gr, y+2, x+2, img_pad)
cfa_img[y, x+1,
:] = self.malvar('r', r, y+2, x+3, img_pad)
cfa_img[y+1, x,
:] = self.malvar('b', b, y+3, x+2, img_pad)
cfa_img[y+1, x+1,
:] = self.malvar('gb', gb, y+3, x+3, img_pad)
self.img = cfa_img
return self.clipping()
return self.clipping()
18 changes: 11 additions & 7 deletions model/cnf.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
import numpy as np


class CNF:
'Chroma Noise Filtering'

Expand Down Expand Up @@ -89,13 +90,14 @@ def cnd(self, y, x, img):
for i in range(y - 4, y + 4, 1):
for j in range(x - 4, x + 4, 1):
if i % 2 == 1 and j % 2 == 0:
avgG = avgG + img[i,j]
avgG = avgG + img[i, j]
elif i % 2 == 0 and j % 2 == 1:
avgG = avgG + img[i, j]
elif i % 2 == 0 and j % 2 == 0:
avgC1 = avgC1 + img[i,j] # weights are equal, could be as gaussian dist
# weights are equal, could be as gaussian dist
avgC1 = avgC1 + img[i, j]
elif i % 2 == 1 and j % 2 == 1:
avgC2 = avgC2 + img[i,j]
avgC2 = avgC2 + img[i, j]
avgG = avgG / 40
avgC1 = avgC1 / 25
avgC2 = avgC2 / 16
Expand All @@ -112,9 +114,9 @@ def cnd(self, y, x, img):
def cnf(self, is_color, y, x, img):
is_noise, avgG, avgC1, avgC2 = self.cnd(y, x, img)
if is_noise:
pix_out = self.cnc(is_color, img[y,x], avgG, avgC1, avgC2)
pix_out = self.cnc(is_color, img[y, x], avgG, avgC1, avgC2)
else:
pix_out = img[y,x]
pix_out = img[y, x]
return pix_out

def execute(self):
Expand All @@ -132,7 +134,8 @@ def execute(self):
cnf_img[y, x] = self.cnf('r', y + 4, x + 4, img_pad)
cnf_img[y, x + 1] = gr
cnf_img[y + 1, x] = gb
cnf_img[y + 1, x + 1] = self.cnf('b', y + 5, x + 5, img_pad)
cnf_img[y + 1, x +
1] = self.cnf('b', y + 5, x + 5, img_pad)
elif self.bayer_pattern == 'bggr':
b = img_pad[y + 4, x + 4]
gb = img_pad[y + 4, x + 5]
Expand All @@ -141,7 +144,8 @@ def execute(self):
cnf_img[y, x] = self.cnf('b', y + 4, x + 4, img_pad)
cnf_img[y, x + 1] = gb
cnf_img[y + 1, x] = gr
cnf_img[y + 1, x + 1] = self.cnf('r', y + 5, x + 5, img_pad)
cnf_img[y + 1, x +
1] = self.cnf('r', y + 5, x + 5, img_pad)
elif self.bayer_pattern == 'gbrg':
gb = img_pad[y + 4, x + 4]
b = img_pad[y + 4, x + 5]
Expand Down
13 changes: 10 additions & 3 deletions model/csc.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import numpy as np
from scipy.ndimage import correlate


class CSC:
'Color Space Conversion'

Expand All @@ -22,9 +23,15 @@ def execute(self):
# csc_img[y,x,2] = np.sum(mulval[2]) + self.csc[2,3]
# csc_img[y,x,:] = csc_img[y,x,:] / 1024

csc_img[:, :, 0] = self.img[:, :, 0] * self.csc[0, 0] + self.img[:, :, 1] * self.csc[0, 1] + self.img[:, :, 2] * self.csc[0, 2] + self.csc[0, 3]
csc_img[:, :, 1] = self.img[:, :, 0] * self.csc[1, 0] + self.img[:, :, 1] * self.csc[1, 1] + self.img[:, :, 2] * self.csc[1, 2] + self.csc[1, 3]
csc_img[:, :, 2] = self.img[:, :, 0] * self.csc[2, 0] + self.img[:, :, 1] * self.csc[2, 1] + self.img[:, :, 2] * self.csc[2, 2] + self.csc[2, 3]
csc_img[:, :, 0] = self.img[:, :, 0] * self.csc[0, 0] + self.img[:, :, 1] * \
self.csc[0, 1] + self.img[:, :, 2] * \
self.csc[0, 2] + self.csc[0, 3]
csc_img[:, :, 1] = self.img[:, :, 0] * self.csc[1, 0] + self.img[:, :, 1] * \
self.csc[1, 1] + self.img[:, :, 2] * \
self.csc[1, 2] + self.csc[1, 3]
csc_img[:, :, 2] = self.img[:, :, 0] * self.csc[2, 0] + self.img[:, :, 1] * \
self.csc[2, 1] + self.img[:, :, 2] * \
self.csc[2, 2] + self.csc[2, 3]
csc_img = csc_img / 1024

self.img = csc_img.astype(np.uint8)
Expand Down
2 changes: 1 addition & 1 deletion model/dpc.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
import numpy as np


class DPC:
'Dead Pixel Correction'

Expand Down Expand Up @@ -55,4 +56,3 @@ def execute(self):
dpc_img[y, x] = p0
self.img = dpc_img
return self.clipping()

8 changes: 6 additions & 2 deletions model/eeh.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/python
import numpy as np


class EE:
'Edge Enhancement'

Expand Down Expand Up @@ -43,7 +44,10 @@ def execute(self):
em_img = np.empty((img_h, img_w), np.int16)
for y in range(img_pad.shape[0] - 2):
for x in range(img_pad.shape[1] - 4):
em_img[y,x] = np.sum(np.multiply(img_pad[y:y+3, x:x+5], self.edge_filter[:, :])) / 8
ee_img[y,x] = img_pad[y+1,x+2] + self.emlut(em_img[y,x], self.thres, self.gain, self.emclip)
em_img[y, x] = np.sum(np.multiply(
img_pad[y:y+3, x:x+5], self.edge_filter[:, :])) / 8
ee_img[y, x] = img_pad[y+1, x+2] + \
self.emlut(em_img[y, x], self.thres,
self.gain, self.emclip)
self.img = ee_img
return self.clipping(), em_img
Loading